Bonjour =)
Afin d'apprendre a manier les sockets, je m'essaye a des scripts type "Chat". Actuellement je suis sur un script qui ne fonctionne pas parfaitement.
A l'heure actuelle, il ne s'affiche rien, mais je déduis que l'échange de sockets s'effectue a peut prêt bien.
Voici le script faisant office de serveur:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 <?php set_time_limit(0); //On crée notre classe class Chat_Server { var $socket=NULL; var $client=NULL; //Méthode qui démarre le serveur function Start($adresse,$port) { ob_start(); echo"Lancement du serveur...\n"; $this->clients=array(); //Création de la socket $this->socket = socket_create(AF_INET, SOCK_STREAM, 0); //on lie la ressource sur laquelle le serveur va écouter @socket_bind($this->socket, $adresse, $port) or die("Port déja utilise\n"); //On prépare l'écoute socket_listen($this->socket); //Boucle infinie, car le serveur ne doit s'arrêter que si on lui demande while(true) { //Le code se bloque jusqu'à ce qu'une nouvelle connexion client soit établie $this->client = socket_accept($this->socket); //Cette méthode lit les données reçues par un client, et les redistribue $reception = socket_read($this->client , 255); $pseudo = substr($reception , 0 , strpos($reception , ' ')); $message = substr($reception , strpos($reception , ' ')+1 , strlen($reception)); //Le message est "/connect", donc on stocke la socket dans le tableau if($message == "/connect") { $this->clients[$pseudo]=$this->client; echo "$pseudo connected\n"; } //C'est donc un message : ici on va envoyer le message vers chacun des clients else { echo "Pseudo: [".$pseudo."] Message recu: [".$message."] Message envoye a : "; //On passe chaque case du tableau = chaque client, et on lui envoie le message foreach( $this->clients as $nom_case => $socket_en_cours) { //Si ça ne marche pas, c'est qu'il est déconnecté if(@socket_write($socket_en_cours, $reception, strlen($reception)) === false) { //La socket est enlevée du tableau unset($this->clients[$nom_case]); echo "[$nom_case s'est deconnecte]"; } else echo "$nom_case "; } //On ferme la socket qui vient de nous apporter un message socket_close($this->client); echo"\n"; ob_flush(); flush(); } } } } $chat = new Chat_Server(); $chat->Start('127.0.0.1',10001); ?>
Script censé récupéré et afficher les sockets:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 <?php set_time_limit(0); $adresse='127.0.0.1'; $port=10001; ob_start(); $pseudo=$_POST['pseudo'] ; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if(!@socket_connect($socket, $adresse, $port)) echo "Le serveur n'est pas lancé"; else { $message = $pseudo." /connect"; socket_write($socket, $message , strlen($message)); while(true) { if($input = @socket_read($socket, $port)) { $pseudo = stripslashes(utf8_decode(substr($input , 0 , strpos($input , ' ')))); $message = stripslashes(utf8_decode(substr($input , strpos($input , ' ')+1 , strlen($input)))); echo '['.$pseudo.']: '.$message.'<br />'; ob_flush(); flush(); } else { echo "Le serveur a été éteint"; break; } } socket_close($socket); } ?>
Et le script qui envoie les chaine au serveur:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <?php $adresse='127.0.0.1'; $port=10001; if(!empty($_GET['message'])) { //Création de la socket $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //Connexion au serveur socket_connect($socket,$adresse,$port); //Construction du paquet à envoyer au serveur $paquet=str_replace(' ' , ' ' ,$_GET['pseudo']).' '.$_GET['message']; //Ecriture du paquet vers le serveur socket_write($socket,$paquet,strlen($paquet)); //Fermeture de la connexion socket_close($socket); } ?>
J'ai l'impression que les sockets s'échange, mais que l'affichage ne s'effectue pas (flush?)
Merci d'avance a qui me donnera une piste ou un coup de main![]()
Partager