Maison >développement back-end >tutoriel php >Explication détaillée de l'utilisation du socket en php

Explication détaillée de l'utilisation du socket en php

墨辰丷
墨辰丷original
2018-05-30 16:09:512173parcourir

La signification anglaise originale de socket est « trou » ou « socket ». En tant que mécanisme de communication de processus de BSD UNIX, c'est ce dernier sens qui est pris. Utilisé pour décrire les adresses IP et les ports, et constitue le descripteur d'une chaîne de communication. Les hôtes sur Internet exécutent généralement plusieurs logiciels de services et fournissent plusieurs services en même temps. Chaque service ouvre un Socket et le lie à un port. Différents ports correspondent à différents services

La programmation des sockets PHP est relativement difficile à comprendre. Cependant, nous n'avons besoin que de comprendre quelques fonctions du socket. Cela ne devrait pas être difficile. pour comprendre la relation entre eux et les rôles qu'ils jouent. De l'avis de l'auteur, la programmation socket consiste en fait à établir un client et un serveur pour un service réseau, ce qui est similaire au client et au service de MySQL. Tant que vous comprenez ce que sont le client et le serveur MySQL, vous devriez être capable de comprendre de quoi je vais parler ci-dessous.

À propos des protocoles réseau impliqués dans la programmation des sockets, tels que TCP, UDP, socket three-way handshake, etc. Il existe des explications très détaillées de ces protocoles réseau sur Internet, je n'entrerai pas dans les détails ici. Je vais juste couper une socket pour créer une socket. Laissez-moi vous montrer le schéma du processus :

Je voudrais également exprimer ma gratitude à l'auteur dont la capture d'écran m'a été volée. Je m'excuse d'avoir volé votre modèle. J'espère que cela ne vous intéresse pas. Je suis trop paresseux pour dessiner (en fait, cela signifie que je n'ai pas confiance en mes compétences en dessin, haha).

Comment la prise établit-elle une connexion ? Comme mentionné ci-dessus, le processus d'établissement d'une connexion est essentiellement le même que la connexion entre le client MySQL et le serveur. La différence entre celui-ci et MySQL est que le serveur et le client de MySQL ont été édités pour nous, il nous suffit de l'appliquer. Cependant, le moment critique est arrivé. Socket ne nous apporte rien. La seule chose qu'il nous offre, c'est : des dizaines de fonctions socket.

L'implication est que la programmation socket nous oblige à créer le serveur et le client nous-mêmes. En d'autres termes, la « programmation socket » nous oblige à créer un serveur et un client similaires à l'application de terminal MySQL.

En parlant de ça, je voudrais demander, pensez-vous que cette prise est un casse-tête ? Cela ne crée ni un serveur ni un client à appliquer. Nous devons utiliser la fonction socket nous-mêmes et créer notre propre application de socket de protocole réseau. Cela ne vous donne-t-il pas mal à la tête ? Il n’y a pas de solution à ce casse-tête. Si vous avez besoin de votre propre application, vous devez toujours vous occuper des sockets. Haha, ce n’est qu’une parenthèse, je ne dirai pas grand chose, allons droit au but.

Avant que vous ne soyez dérouté par la programmation des sockets, je vais vous laisser jeter un œil à plusieurs fonctions clés du socket et vous expliquer leurs fonctions respectives. Sinon, si quelqu'un qui n'a aucune base en programmation de sockets lit ceci, j'ai peur qu'après l'avoir lu, vous sautiez définitivement cet article et développiez désormais une phobie des sockets. Haha, j'en ai dit plus.

  Fonction clé 1 du socket :

  socket_create(paramètre $net 1, paramètre $stream 2, paramètre $protocol 3)

  Fonction : Créer un socket socket, Mettre franchement, il s’agit d’un flux de données réseau.

Valeur de retour : un socket, ou false, un avertissement E_WARNING est émis pour les erreurs de paramètres

Le manuel en ligne PHP le rend plus clair :

socket_create crée et renvoie un Socket, également appelé nœud de communication. Une connexion réseau typique se compose de 2 sockets, l’un fonctionnant côté client et l’autre côté serveur.

La phrase ci-dessus est copiée du manuel php en ligne. Voyez-vous que la signification ici est exactement la même que celle du client et du serveur que j'ai mentionnés à plusieurs reprises ci-dessus ? héhé.

 Le paramètre 1 est : protocole réseau,

 Quels sont les protocoles réseau ? Ses options sont les trois suivantes :

 AF_INET : protocole réseau IPv4. TCP et UDP peuvent utiliser ce protocole. C'est généralement utilisé, vous savez.

 AF_INET6 : protocole réseau IPv6. TCP et UDP peuvent utiliser ce protocole.

 AF_UNIX : Protocole de communication local. IPC (Inter-Process Communication) performant et économique.

Paramètre 2 : Flux de socket, les options sont :

SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW SOCK_RDM.

Seuls les deux premiers sont expliqués ici :

Socket de protocole TCP SOCK_STREAM.

Socket de protocole UDP SOCK_DGRAM.

Pour plus d'informations, veuillez créer un lien ici : http://php.net/manual/zh/function.socket-create.php

Paramètre 3 : protocole, les options sont :

SOL_TCP : protocole TCP.

SOL_UDP : protocole UDP.

On peut voir d'ici que le deuxième paramètre et le troisième paramètre de la fonction socket_create sont en fait liés.

Par exemple, si votre premier paramètre utilise le protocole IPv4 : AF_INET, et qu'ensuite le deuxième paramètre utilise le socket TCP : SOCK_STREAM,

Alors le troisième paramètre doit être utilisé SOL_TCP, cela ne doit pas être difficile à comprendre.

Quant au socket du protocole TCP, bien sûr il ne peut utiliser que le protocole TCP, non ? Si vous utilisez des sockets UDP, je ne dirai pas comment choisir le troisième paramètre, haha, vous savez.

Fonction clé 2 :

socket_connect(paramètre $socket 1, paramètre $ip 2, paramètre $port 3)

Fonction : connectez un socket, la valeur de retour est vraie ou false

 Paramètre 1 : valeur de retour de la fonction socket_create

 Paramètre 2 : adresse IP

 Paramètre 3 : Numéro de port

 Fonction clé 3 :

  socket_bind(paramètre $socket 1, paramètre $ip 2, paramètre $port 3)

  Fonction : Lier une socket, la valeur de retour est vraie ou fausse

   Paramètres 1 : fonction valeur de retour de socket_create

Paramètre 2 : adresse IP

Paramètre 3 : numéro de port

Fonction clé 4 :

socket_listen($socket paramètre 1,$ backlog Paramètre 2)

Fonction : Écoutez un socket, la valeur de retour est vraie ou fausse

Paramètre 1 : La fonction renvoie la valeur de socket_create

Paramètre 2 : Nombre maximum des sockets d'écoute

Fonction clé 5 :

socket_accept ($socket)

Fonction : recevoir les informations sur les ressources du socket et renvoyer le socket avec succès Ressources d'information, l'échec est faux

Paramètres : valeur de retour de la fonction socket_create

Fonction clé 6 :

socket_read(paramètre $socket 1, paramètre $length 2)

Fonction : Lire les informations de ressource du socket,

Valeur de retour : conversion réussie de la ressource de socket en informations de chaîne, l'échec est faux

Paramètre 1 : socket_create ou La valeur de retour de la fonction socket_accept

Paramètre 2 : La longueur de la chaîne lue

Fonction clé 7 :

socket_write(paramètre $socket 1, paramètre $msg 2, paramètre $ strlen 3)

Fonction : Écrivez des données dans le socket

Valeur de retour : Renvoie la longueur en octets de la chaîne en cas de succès, false

en cas d'échec Paramètre 1 : La fonction renvoie la valeur de socket_create ou socket_accept

Paramètre 2 : Chaîne

Paramètre 3 : La longueur de la chaîne

Fonction clé 8 :

socket_close($ socket)

Fonction : Fermer le socket

Valeur de retour : vrai en cas de succès, faux en cas d'échec

Paramètres : valeur de retour de la fonction socket_create ou socket_accept

Ces huit fonctions sont les fonctions principales de socket Vous trouverez ci-dessous. deux autres fonctions importantes

Socket_last_error($socket). Le paramètre est la valeur de retour de socket_create. Sa fonction est d'obtenir le dernier code d'erreur du socket Numéro, valeur de retour code de socket

socket_strerror($code), le paramètre est la valeur de retour de la fonction socket_last_error, récupère les informations de chaîne du code, la valeur de retour est le message d'erreur du socket

Ces deux fonctions sont toujours très importantes dans socket programmation. Lors de l'écriture de la programmation socket, je pense qu'il faut quand même les utiliser, surtout pour les novices. Ils peuvent être utilisés pour le débogage

C'est le code, faites attention, veuillez lire attentivement mes commentaires, les commentaires sont très. important, les commentaires sont très importants, les commentaires sont très importants, les choses importantes doivent être criées trois fois, haha.

Script serveur, D:vhosttestsocketserver_socket.php

Astuce : Attention, l'ordre d'exécution des trois fonctions socket_bind, socket_listen et socket_accept ci-dessus ne peut pas être modifié, c'est-à-dire
<?php
//创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);

  /*绑定接收的套接流主机和端口,与客户端相对应*/
  if(socket_bind($socket,&#39;127.0.0.1&#39;,8888) == false){
    echo &#39;server bind fail:&#39;.socket_strerror(socket_last_error());
    /*这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址*/
  }
  //监听套接流
  if(socket_listen($socket,4)==false){
    echo &#39;server listen fail:&#39;.socket_strerror(socket_last_error());
  }
//让服务器无限获取客户端传过来的信息
do{
  /*接收客户端传过来的信息*/
  $accept_resource = socket_accept($socket);
  /*socket_accept的作用就是接受socket_bind()所绑定的主机发过来的套接流*/

  if($accept_resource !== false){
    /*读取客户端传过来的资源,并转化为字符串*/
    $string = socket_read($accept_resource,1024);
    /*socket_read的作用就是读出socket_accept()的资源并把它转化为字符串*/

    echo &#39;server receive is :&#39;.$string.PHP_EOL;//PHP_EOL为php的换行预定义常量
    if($string != false){
      $return_client = &#39;server receive is : &#39;.$string.PHP_EOL;
      /*向socket_accept的套接流写入信息,也就是回馈信息给socket_bind()所绑定的主机客户端*/
      socket_write($accept_resource,$return_client,strlen($return_client));
      /*socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息*/
    }else{
      echo &#39;socket_read is fail&#39;;
    }
  /*socket_close的作用是关闭socket_create()或者socket_accept()所建立的套接流*/
    socket_close($accept_resource);
  }
}while(true);
socket_close($socket);

Vous devez d'abord exécuter socket_bind, puis socket_listen, et enfin socket_accept

Script client, D: vhosttestsocketclient_socket.php

Comment tester ces deux scripts ?
<?php
  //创建一个socket套接流
  $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
  /****************设置socket连接选项,这两个步骤你可以省略*************/
   //接收套接流的最大超时时间1秒,后面是微秒单位超时时间,设置为零,表示不管它
  socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));
   //发送套接流的最大超时时间为6秒
  socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 6, "usec" => 0));
  /****************设置socket连接选项,这两个步骤你可以省略*************/

  //连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系
  if(socket_connect($socket,&#39;127.0.0.1&#39;,8888) == false){
    echo &#39;connect fail massege:&#39;.socket_strerror(socket_last_error());
  }else{
    $message = &#39;l love you 我爱你 socket&#39;;
    //转为GBK编码,处理乱码问题,这要看你的编码情况而定,每个人的编码都不同
    $message = mb_convert_encoding($message,&#39;GBK&#39;,&#39;UTF-8&#39;);
    //向服务端写入字符串信息

    if(socket_write($socket,$message,strlen($message)) == false){
      echo &#39;fail to write&#39;.socket_strerror(socket_last_error());

    }else{
      echo &#39;client write success&#39;.PHP_EOL;
      //读取服务端返回来的套接流信息
      while($callback = socket_read($socket,1024)){
        echo &#39;server return message is:&#39;.PHP_EOL.$callback;
      }
    }
  }
  socket_close($socket);//工作完毕,关闭套接流

Tout d'abord, ouvrez la fenêtre DOS de Windows, qui est la fenêtre noire cmd, puis exécutez php D:vhosttestsocketserver_socket.php,

Laissez la fenêtre noire du serveur continuer à s'exécuter,

Deuxièmement, le script du client php peut être exécuté via le navigateur, ou vous pouvez ouvrir une fenêtre noire cmd pour exécuter

 php D:vhosttestsocketclient_socket.php

Veuillez noter ici : le nom de l'exécution de php doit être Ajoutez-le aux variables d'environnement de Windows. Si vous ne savez pas comment l'ajouter,

Veuillez entrer dans le répertoire de la commande d'exécution de php et l'exécuter avec une commande absolue. peut également ajouter la commande php à la variable d'environnement dans Baidu

Voici ma situation, l'adresse de votre fichier peut être différente de la mienne, veuillez opérer en fonction de votre situation d'adresse, sinon, vous serez responsable des conséquences, haha

Comme mentionné ci-dessus, la programmation socket nécessite un serveur pour communiquer, la fenêtre noire du serveur doit donc rester ouverte.

Postscript :

socket_set_option(paramètre $socket 1, paramètre $level 2, paramètre $optname 3, paramètre $optval 4)

La fonction de cette fonction est de définir L'interface définit les options de flux de données, ce qui constitue également une fonction très importante.

Paramètre 1 : valeur de retour de la fonction socket_create ou socket_accept

Paramètre 2 : SOL_SOCKET, il semble que cette option soit la seule

Le paramètre 3 est lié au paramètre 4,

Le paramètre 3 peut être : SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEO

Explication :

SO_REUSEADDR Il permet de réutiliser le port socket immédiatement après sa libération

Si le paramètre 3 est celui-ci, alors le paramètre 4 peut être vrai ou faux

SO_RCVTIMEO  C'est le délai d'expiration maximum de la ressource de réception du socket

SO_SNDTIMEO  C'est le délai d'expiration maximum de la ressource de réception du socket ressource d'envoi

Si le paramètre 3 est ces deux-là, alors le paramètre 4 est un tableau array('sec'=>1,'usec'=>500000)

Array They tous définissent le délai d'expiration maximum, mais l'un est en secondes et l'autre en microsecondes, et l'effet est le même

Ce qui précède est tout le contenu de cet article, j'espère qu'il sera utile à tout le monde.


Recommandations associées :

Explication détaillée des méthodes magiques couramment utilisées en PHP

PHP Explication détaillée de la façon d'utiliser les cookies en chinois

Méthode PHP pour résoudre les caractères chinois tronqués

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn