[Plan du site]
Vous êtes ici ---
> Le Site du Zéro
> Les tutoriels
> Non-Officiels
> Site Web
> PHP
> Points particuliers
> Comment utiliser les sockets avec php ? Comment faire un chat avec les sockets ? > Partie théorique : l'utilisation des sockets > Les sockets
> Lecture du tutoriel
Les sockets
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Attaquons-nous aux choses sérieuses. En guise d'introduction, nous allons voir quelques notions théoriques qu'il est nécessaire de connaître pour bien comprendre le fonctionnement des sockets, et des communications réseau en général ; puis nous finirons sur des exemples concrets où nous manipulerons les sockets.
Premières notions de Client-Serveur
Client, serveur, ça peut faire penser à un restaurant ou un commerce du genre, et tu verras qu'on n'en est pas si loin, en fait. Alors, qu'est-ce qu'un client ? Le client est le programme qui va se connecter à un serveur. Qu'est-ce qu'un serveur ? Un serveur est un programme qui attend les connexions de clients, et qui leur donne ce qu'ils veulent. J'explicite : prenons exemple avec notre ami FireFox. Firefox est un client web, c'est-à-dire un programme qui va se connecter à un serveur web, et lui demander diverses choses : "donne-moi le tuto d'azmeuk sur les sockets !". Le serveur web (comme par exemple Apache -qui est inclus dans Easy-PHP, Wamp etc.-), lui, va "attendre" que FireFox lui demande de lui transmettre une page web, puis va transmettre la page demandée.
Par abus de langage, on confond souvent le programme serveur, et le PC qui l'héberge, de même on confond souvent client et le PC qui l'héberge. Donc, si jamais la désignation de client ou de serveur te semble un peu ambigüe, c'est normal : elle peut avoir deux sens.
Ce qu'il faut retenir, c'est qu'il y a un seul serveur (ou tout du moins une poignée, dans certains cas) pour une multitude de clients. Le Site du Zéro a un serveur web (Lisa) pour 40 000 zéros à l'heure actuelle. Et donc le serveur doit répondre à tous les clients.
Le rapport avec ce tuto ? Eh bien nous allons créer un chat ; et pour ce faire, nous allons créer un client et un serveur. Pour faire simple, imaginons un salon de chat avec quelques utilisateurs connectés. Si l'utilisateur A veut dire à tout le monde "Hello World", alors il envoie un message au serveur et lui dit: "je veux dire Hello World à tout le monde". Le serveur va donc transmettre le message à chacun des clients connectés. Voici un petit schéma illustratif.
Adresses IP et Ports
Dans l'océan qu'est le web, ton IP représente les coordonnées de ton PC, c'est son adresse postale ; bref, c'est un numéro propre à ton PC, et c'est uniquement grâce à ça qu'on peut l'identifier. C'est une suite de 4 numéros de 0 à 255 séparés par des points, par exemple : 192.168.0.1
L'adresse IP 127.0.0.1 désigne toujours le PC "local", chaque PC comprend ceci : 127.0.0.1 = MOI.
Pour faire simple (parce que je n'ai pas pour but ici de faire une explication détaillée juste sur le protocole IP), quand tu te connectes à internet, ton
FAI attribue à ton PC une adresse IP : par exemple, 123.45.67.89 ; ainsi, quand un autre PC veut communiquer avec toi, il dit: "hey ! Je veux dire un truc à 123.45.67.89 !". Il t'écrit une lettre, avec ton adresse IP comme adresse postale. Mais si ça s'arrêtait là, ce serait bien trop beau ; ce monde de brutes a voulu que ton PC soit une collocation monstre dans laquelle vivent des dizaines de programmes : quand ton PC reçoit un message, qui doit le lire ? Ton serveur web ? Ton serveur MySQL ? Pour parer à cette éventualité, on a donc créé les ports : il y a 65536 ports sur un PC normalement constitué, et à chacun de ces ports et assigné un programme : le port qu'utilise chaque serveur web est le port 80 ; ton serveur web n'ouvrira donc que les lettres adressées à 123.45.67.89:80, et il en va de même pour chaque autre programme avec le port qui lui est assigné.
TCP versus UDP
Quand deux ordinateurs communiquent, il ne font pas les choses n'importe comment. En effet, ils suivent ce qu'on appelle un protocole. Le protocole est un ensemble de règles qui encadrent la transmission d'un message. Par exemple : "tout message envoyé devra avoir un accusé de réception". Les deux protocoles utilisés sur Internet son UDP et TCP qui diffèrent par certains points et sont donc utilisés dans des cas bien distincts :
Le protocole TCP
Le protocole TCP vise la fiabilité, à savoir qu'en gros "tout message envoyé doit être reçu". Ça peut paraître logique, et pourtant, on verra avec UDP. Pour ce faire, TCP use de plusieurs stratagèmes, comme par exemple les accusés de réception. Si, pour chaque lettre envoyée, on a un accusé de réception, alors on est sûrs que la lettre en question a bien atteint le destinataire ; si jamais on ne recevait pas d'accusé de réception au bout d'un certain temps, alors il ne nous reste plus qu'à ré-envoyer la lettre. TCP est assez coûteux en ressource et en
bande passante. TCP est donc utilisé dans tous les cas où tu veux être sûr que ton interlocuteur recevra ton message (tu verras que ce n'est pas toujours le cas), et tu y mettras le prix...
Le protocole UDP
Le protocole UDP permet très simplement la transmission d'un message, c'est-à-dire qu'il n'y a aucun accusé de réception comme on l'a vu dans TCP ; donc, tu envoies tout un tas de lettres à un ami, et tu ne te soucies pas de savoir s'il l'a reçu. Pourquoi faire ça ? Eh bien dans tout un tas de cas où tu envoies tellement de messages à ton interlocuteur que tu as grand besoin de bande passante : si ton interlocuteur n'a pas reçu un message sur la masse que tu lui avais envoyée, ce n'est pas grave. Des exemples ? La téléphonie IP, des vidéos en
streaming, pas mal de jeux vidéos en ligne (des
FPS), etc.
Le buffer
Le buffer, ou mémoire tampon, est selon
Wikipedia une zone de mémoire vive ou de disque utilisée pour stocker temporairement des données. Pour faire simple, le buffer est "la liste des choses à envoyer" : c'est le tas d'enveloppes que tu dois envoyer à moult destinataires, et qui trône sur un coin de ton bureau. Ainsi, quand un ordinateur veut envoyer un message, le message transite d'abord par le buffer avant d'être envoyé. A quoi ça sert ? Eh bien ça sert à réconcilier le débit de ta ligne internet et ton processeur. En effet, un processeur d'une fréquence de 3 Ghz par exemple, va effectuer trois milliards d'opérations à la seconde ; ta ligne ADSL n'a pas un débit qui permet de suivre, le processeur met alors tous les messages dans un buffer, qui lui se charge de les transmettre, à la vitesse de la ligne. Nous nous servirons du buffer dans le chapitre pratique de ce tuto.
Pour reprendre la métaphore de la lettre, si les ordinateurs utilisent la voie postale pour communiquer entre eux, alors une socket est une enveloppe : elle contiendra un message et ira d'un ordinateur à un autre.
Avantages et inconvénients
Avantages
- Échange de données en temps réel
- Ne consomme pas beaucoup de ressources pour le serveur.
- Passe-partout. Les sockets ne sont pas réservées qu'à PHP : on peut donc très bien échanger des données avec tel ou tel programme codé en tel ou tel langage.
Inconvénients
- Accepté par très peu d'hébergeurs. Par contre, si tu as ton propre serveur, c'est très bien.
- Sécurité. Il vaudrait mieux crypter les données, notamment à cause du sniffing.
Activation
Les sockets sont des extensions de php, et nécessitent d'être activées (rappelle-toi, les librairies
gd !).
Windows
Il faut utiliser la méthode habituelle : allez chercher dans votre php.ini (par exemple, pour ceux qui utilisent Easyphp, C:\Program Files\Easyphp1-8\php\php.ini), la ligne où il y a
Code : Autre1
| ;extension=php_sockets.dll |
et supprimez le ";" .
Linux
Pour ma part, les sockets étaient déjà activées, je n'ai pas eu besoin de les activer ; sinon, la technique est la même que sous Windows.
Sauvegardez, redémarrez votre serveur, et c'est parti !
Liste des fonctions
Voici donc la liste des fonctions que nous allons utiliser.
- socket_create($domaine , $type , $protocole) Crée une socket.
- Selon la documentation PHP, il y a trois domaines possibles (un domaine est une famille de protocoles) : AF_INET, AF_INET6 et AF_UNIX. Comme on veut utiliser le protocole TCP, on doit alors se servir de AF_INET ou alors AF_INET6 ; pour des raisons de compatibilité, on va se servir de AF_INET.
- Pour le type de socket, nous avons le choix entre SOCK_STREAM, sur lequel se base TCP, SOCK_DGRAM, sur lequel se base UDP, SOCK_RAW sur lequel est basé le protocole ICMP (qui est en fait plus utilisé par le système d'exploitation que par les utilisateurs), SOCK_SEQPACKET et SOCK_RDM, qui sont bien moins utilisées et que, par conséquent, nous n'expliciterons pas.
Nous utiliserons donc SOCK_STREAM.
- Enfin, nous devons choisir un protocole entre SOL_UDP, SOL_TCP et ICMP, et je vous laisse deviner lequel on va choisir ...
- socket_strerror($erreur) Retourne les erreurs liées à la socket, dans un langage compréhensible.
Le seul argument doit être la cause de l'erreur.
- socket_bind($socket , $adresse , $port) Assigne une socket à un port et une ip.
Le premier argument doit être la socket à assigner, le second l'adresse du serveur sur lequel on va assigner la socket, en enfin, le troisième doit être le port de la socket.
- socket_read($socket , $taille) Lit une socket.
Le premier argument doit être la socket que l'on va lire, et le second doit être la taille maximum du message qu'elle contiendra.
- socket_write($socket , $message , strlen($message)) Écrit dans une socket
Le premier argument doit être la socket dans laquelle on va écrire, le second doit être le message à envoyer, et le troisième, la longueur de ce message.
- socket_close($socket) Ferme la connexion.
Le seul argument doit être la socket à fermer.
- socket_connect($socket , $adresse , $port) Connecte la socket.
Le premier argument doit être la socket à connecter, le second l'adresse ip à laquelle on doit se connecter, et le dernier doit être le port. Cette fonction est utilisée par le client pour se connecter au serveur.
- socket_listen($socket) Écoute les réponses sur une socket.
Le seul argument doit être la socket à écouter. Cette fonction est utilisée par le serveur.
- socket_accept($socket) Accepte une socket
Le seul argument doit être la socket à accepter. Cette fonction est utilisée par le serveur.
Si tu veux voir la documentation officielle de php sur les sockets,
c'est par ici. Et c'est d'ailleurs par là que nous allons commencer !
Posons-nous une question primordiale :
Comment on utilise une socket ?
- Il faut que le serveur ait créé une socket sur laquelle nous puissions nous connecter.
Il faut que le serveur ait une boîte aux lettres.
- On crée une socket vide avec socket_create()
On se procure une enveloppe.
- On se connecte avec socket_connect()
On écrit l'adresse du serveur sur l'enveloppe.
- On prépare le message que l'on va placer dans la socket.
On écrit la lettre.
- On écrit dans la socket avec socket_write() et on envoie la socket au serveur.
On met la lettre dans l'enveloppe et on l'envoie.
- On écoute la réponse du serveur avec socket_read();
Le serveur répond à notre lettre, mais comme c'est un gros radin et qu'il n'a pas envie de payer de nouvelles enveloppes, il nous renvoie la réponse dans la même enveloppe.
Comme exemple de commencement, je n'ai pas trouvé mieux que l'exemple officiel de PHP (mais je l'ai un poil modifié

)
Code : PHP 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 | <?php
error_reporting(E_ALL);
echo "<h2>Connexion TCP/IP</h2><br />";
/* Lit le port du service WWW. */
$service_port = getservbyname('www' , 'tcp');
/* Lit l'adresse IP du serveur de destination */
$adresse = gethostbyname('www.siteduzero.com');
/* Crée une socket TCP/IP. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0)
echo "socket_create() a échoué : raison : " . socket_strerror ($socket) . "<br />";
else
echo "OK.<br />";
echo "Essai de connexion à $adresse sur le port '$service_port'...";
$resultat = socket_connect($socket, $adresse, $service_port);
if ($resultat < 0)
echo "socket_connect() a échoué : raison : ($result) " . socket_strerror($result) . "<br />";
else
echo "OK.<br />";
$envoi = "HEAD / HTTP/1.0\r\n\r\n";
$envoi .= "Host: www.siteduzero.com\r\n";
$envoi .= "Connection: Close\r\n\r\n";
$reception = '';
echo "Envoi de la requête HTTP HEAD...";
socket_write($socket, $envoi, strlen($envoi));
echo "OK.<br />";
echo "Lire la réponse : <br /><br />";
while ($reception = socket_read($socket, 2048))
echo $reception;
echo "Fermeture de la socket...";
socket_close($socket);
echo "OK.<br /><br />";
?>
|
Si tu n'as rien compris, ce n'est pas grave, je suis là pour t'expliquer.

Nous allons reprendre petit à petit le code, mais d'abord quelques explications.
Avec cet exemple, nous allons nous connecter au serveur du Site du Zéro, sur le port http, c'est-à-dire sur le port qu'il utilise pour nous envoyer des pages Web. Le serveur du Site Du Zéro a donc créé une socket sur laquelle nous allons nous connecter. Une fois connecté, nous allons lui poser une question et attendre la réponse.
Quand je dis "sur le port HTTP", c'est un abus de langage, HTTP est un
protocole, et non pas un port car un port, comme nous l'avons vu tout à l'heure, est un numéro. Cependant, HTTP n'est pas un protocole du même genre que TCP ou UDP. Souvenez-vous de la définition de "protocole" que j'avais donnée tout à l'heure :
le protocole est un ensemble de règles qui encadrent la transmission d'un message. Pour le coup, les règles ne s'appliqueront pas sur la manière d'envoyer le message, mais sur son contenu. Voici un exemple de règle :
"Chaque message doit comporter au maximum 256 caractères. Les messages devront commencer par PLOP, et finir par PLIP. Les messages qui commenceront par PLIP-IMPORTANT seront considérés comme plus importants que les autres". L'ensemble des règles des protocoles les plus utilisés sont définis dans les RFC (par exemple
AbcdRFC héberge un bon nombre de RFC traduites en français, incluant
la RFC HTTP). Par port HTTP, je veux donc dire : le port qu'utilise le protocole HTTP" .
Voyons le code en détails :
Code : PHP
Cette fonction sert simplement à dire à PHP d'afficher presque toutes les erreurs.
Code : PHP1 | $service_port = getservbyname('www' , 'tcp');
|
Sans détailler, cette fonction sert juste à demander quel est le port qu'utilise le protocole
http.
Code : PHP1
2 | /* Lit l'adresse IP du serveur de destination */
$adresse = gethostbyname('www.siteduzero.com');
|
Comme c'est indiqué dans le commentaire, on récupère avec ceci l'adresse IP du SDZ.
Code : PHP1
2
3
4
5 | $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0)
echo "socket_create() a échoué : raison : " . socket_strerror ($socket) . "<br />";
else
echo "OK.<br />";
|
On commence donc à manier les sockets. Nous créons donc ici une socket vide. Comme il est important que le serveur reçoive CE message, on va utiliser le protocole TCP, on choisit donc les arguments adaptés. Et donc on stocke la socket dans une variable, au même titre que, dans le cours sur les librairies gd, on stockait des images dans une variable.
Une variable, c'est comme une boîte : on peut y mettre n'importe quoi dedans.
Et ensuite, on vérifie que tout s'est bien passé.
-
L'enveloppe est créée.
Code : PHP1
2
3
4
5 | $resultat = socket_connect($socket, $adresse, $service_port);
if ($resultat < 0)
echo "socket_connect() a échoué : raison : ($resultat) " . socket_strerror($result) . "<br />";
else
echo "OK.<br />";
|
Ici, nous allons nous connecter au serveur du Site Du Zéro. Je pense que les arguments de la fonction
socket_connect() sont assez compréhensibles : le premier argument doit donc être la socket précédemment créée, le second doit être l'adresse ip du serveur sur lequel nous allons nous connecter ; et enfin, le troisième va être le port du serveur sur lequel on va se connecter.
-
On écrit l'adresse sur l'enveloppe :
Code : PHP1
2
3
4 | $envoi = "HEAD / HTTP/1.0\r\n\r\n";
$envoi .= "Host: www.siteduzero.com\r\n";
$envoi .= "Connection: Close\r\n\r\n";
$reception = '';
|
Ici, on prépare simplement le message qu'on va envoyer au serveur. On ne s'attardera pas sur le contenu du message, car ce qui nous intéresse ici, c'est la façon dont il voyage. Mais si tu veux en savoir plus, voici
un tuto fait par un zéro sur le sujet.
-
On écrit la lettre :
Code : PHP1
2
3 | echo "Envoi de la requête HTTP HEAD...";
socket_write($socket, $envoi, strlen($envoi));
echo "OK.<br />";
|
La fonction
socket_write() permet d'écrire le message que l'on veut envoyer dans la socket. De même que tout à l'heure, les arguments ne sont pas très compliqués à comprendre : le premier est la socket par laquelle on va envoyer le message, le second est le message et le troisième est la longueur du message.
De son coté, le serveur va régler la longueur maximale du message à recevoir, et donc si l'on envoie un message plus grand que le maximum autorisé par le serveur, le message sera donc tronqué.
-
On poste la lettre :
Code : PHP1
2
3 | echo "Lire la réponse : <br /><br />";
while ($reception = socket_read($socket, 2048))
echo $reception;
|
Ici, nous allons lire la réponse du serveur grâce à la fonction
socket_read() . Le premier argument est, encore une fois, la socket que nous allons écouter et le second, la longueur maximum de la réponse.
Au même titre que tout à l'heure, si la réponse est plus longue que la limite fixée, alors elle sera tronquée.
Une réponse a été envoyée par le récepteur, mais par la même enveloppe.
Comment on utilise une socket coté serveur ?
- On crée une socket vide avec socket_create()
On crée une boîte aux lettres
- On assigne la socket à une adresse et à un port avec <lien url="http://www.php.net/socket_bind">socket_bind</lien>()
On se donne une adresse
- On écoute les connexions avec socket_listen()
On attend les réponses
- On accepte les connexions avec socket_accept()
On déverrouille la boite aux lettres pour permettre aux gens de nous envoyer du courrier
- On lit les sockets avec socket_read()
On lit la lettre
- On renvoie la socket avec socket_write()
On répond à l'expéditeur, en renvoyant la même enveloppe parce qu'on est des gros radins.
J'ai concocté un petit serveur, et comme tout à l'heure, nous allons l'étudier ligne par ligne.
Code : PHP 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 | <?php
//Temps maximum d'exécution de la page <gras><couleur nom="rouge">nul</couleur></gras>
set_time_limit(0);
//Coordonnées du serveur == le pc qui lancera cette page
$port = 24243;
$adresse = "127.0.0.1";
//On crée la socket
if(($socket = socket_create(AF_INET, SOCK_STREAM, 0)) === false)
echo 'La création de la socket a échoué : '.socket_strerror($socket)."\n<br />";
//On assigne la socket à une adresse et à un port, que l`on va écouter par la suite
if(($assignation = socket_bind($socket, $adresse , $port)) < 0)
echo "L'assignation de la socket a échoué : ".socket_strerror($assignation)."\n<br />";
//On prépare l`écoute
if(($ecoute = socket_listen($socket)) === false)
echo "L'écoute de la socket a échoué : ".socket_strerror($ecoute)."\n<br />";
//Le code se bloque jusqu`à ce qu'une nouvelle connexion client soit établie
if(($client = socket_accept($socket)) === false)
echo "Le client n'a pas pu se connecter : ".socket_strerror($client)."\n<br />";
//Lors d'une connexion, le code reprend ici, il est temps de lire ce qu'on nous envoie
if(($reception = socket_read($client , 255)) === false)
echo "La socket n'a pas pu être lue : ".socket_strerror($reception)."\n<br />";
elseif( $reception == 'plop' )
$reponse = "J'aime les plop";
else
$reponse = "J'aime pas les ".$reception;
//Si ça ne marche pas, c'est qu`il est déconnecté
if(( socket_write($client, $reponse, strlen($reponse)) ) === false)
echo "Client déconnecté\n<br />";
else
echo "Message envoyé : ".$reponse;
//Fermeture de la socket du client
socket_close($client);
//Fermeture du serveur
socket_close($socket);
?>
|
Code : PHP
set_time_limit() permet de choisir le temps maximal d'exécution de la page en secondes : si la valeur est nulle, alors il n'y a pas de limite ; on verra un peu plus bas à quoi ça va nous servir.
Code : PHP1
2 | $port = 24243;
$adresse = "127.0.0.1";
|
Il faut ici donner l'adresse ip du serveur (et choisir un port non utilisé).
Code : PHP1
2 | if(($socket = socket_create(AF_INET, SOCK_STREAM, 0)) === false)
echo 'La création de la socket a échoué : '.socket_strerror($socket)."\n<br />";
|
Comme tout à l'heure, on crée une socket vide, et comme tout à l'heure, les arguments de la fonction
socket_create() sont adaptés au protocole TCP.
On crée non pas une enveloppe, mais une boîte aux lettres
Code : PHP1
2 | if(($assignation = socket_bind($socket, $adresse , $port)) < 0)
echo "L'assignation de la socket a échoué : ".socket_strerror($assignation)."\n<br />";
|
Nouvelle fonction par rapport à tout à l'heure : on assigne la socket à un port, et à une adresse IP. On définit par quel port vont passer nos sockets entrantes. Le premier argument de
socket_bind() est la socket précédemment créée, le second est l'adresse IP du serveur et le troisième, le port à écouter.
On se donne une adresse
Code : PHP1
2 | if(($ecoute = socket_listen($socket)) === false)
echo "L'écoute de la socket a échoué : ".socket_strerror($ecoute)."\n<br />";
|
Ici, on va écouter un port, c'est-à-dire qu'on va surveiller le port pour voir toutes les connexions. Le seul argument de la fonction
socket_listen() est la socket que l'on a créée, à qui on a assigné un port et une adresse.
On se met à regarder la boîte aux lettres pour voir si quelqu'un ne tente pas de nous poster une lettre
Code : PHP1
2 | if(($client = socket_accept($socket)) === false)
echo "Le client n'a pas pu se connecter : ".socket_strerror($client)."\n<br />";
|
Là, on va accepter les sockets clients qui auraient tenté de se connecter.
Le seul argument de la fonction
socket_accept() est la socket que l'on a créée, à qui on a assigné un port et une adresse, et qui écoute un port. On crée grâce à
socket_accept() une socket "client", ici
$client.
On accepte la première lettre qui vient
Code : PHP1
2
3
4
5
6 | if(($reception = socket_read($client , 255)) === false)
echo "La socket n'a pas pu être lue : ".socket_strerror($reception)."\n<br />";
elseif( $reception == 'plop' )
$reponse = "J'aime les plop";
else
$reponse = "J'aime pas les ".$reception;
|
socket_read() va lire la socket précédemment acceptée. Nous allons choisir notre réponse en fonction du message que l'on aura lu. Le premier argument est la socket "client" et le second, la longueur maximum de la réponse.
On lit la lettre, et on formule notre réponse en fonction du contenu de cette première
Code : PHP1
2
3
4 | if(( socket_write($client, $reponse, strlen($reponse)) ) === false)
echo "Client déconnecté\n<br />";
else
echo "Message envoyé : ".$reponse;
|
La fonction
socket_write() permet donc de répondre à la socket client, par la socket "client". Comme tout à l'heure, le premier argument est la socket "client", le second est le message et le troisième, la longueur du message. Si l'écriture de la réponse sur la socket "client" ne marche pas, on en conclut qu'elle n'existe plus, donc que le client est déconnecté.
On répond à l'expéditeur, en utilisant la même enveloppe que lui, et si l'envoi ne fonctionne pas, c'est qu'il a déménagé ou qu'il est mort.
Code : PHP
On ferme la socket client : rien de compliqué là-dedans, mais il ne faut pas l'oublier.
Code : PHP
On ferme le serveur, rien de compliqué non plus là-dedans !
Résumons un peu...
Ici, du coté serveur, on va surveiller un port, accepter la première connexion qui vient et seulement la première, puis répondre à la socket en fonction de ce qu'elle nous aura envoyé. Pour le moment, après une connexion, le serveur s'éteint ; cependant, il est tout à fait possible d'accepter toutes les connexions en faisant un boucle infinie(
while(true)) au dessus de
socket_accept(); (ce que nous allons faire pour le chat) !
Voici un petit script client pour tester le serveur.
Code : PHP 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 | <?php
//Coordonnées du serveur
$port = 24243;
$adresse = "127.0.0.1";
/* Cree une socket TCP/IP. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0)
echo "socket_create() a échoué : raison : " . socket_strerror ($socket) . "<br />";
else
echo "OK.<br />";
echo "Essai de connexion à $address sur le port '$port'...";
$resultat = socket_connect($socket, $adresse, $port);
if ($resultat < 0)
echo "socket_connect() a échoué : raison : ($resultat) " . socket_strerror($resultat) . "<br />";
else
echo "OK.<br />";
$envoi = 'plap';
echo "Envoi de la requête $envoi ...";
socket_write($socket, $envoi, strlen($envoi));
echo "OK.<br />";
echo "Lire la réponse : <br /><br />";
while ($reponse = socket_read($socket, 2048))
echo $reponse;
echo "<br />Fermeture de la socket...";
socket_close($socket);
echo "OK.<br /><br />";
?>
|
Lance le serveur (qui tournera donc à l'infini, tant qu'aucune socket ne s'y sera connectée), puis dans une autre fenêtre, lance le script client. Tu pourras voir la réponse du serveur sur la page client. Essaye avec
$envoi = 'plop';, et vois la différence.
Maintenant que tu sais te servir des sockets, tu peux te la péter auprès de tes potes qui eux, ne savent pas les manier, les nuls !