Maison > Article > développement back-end > Compréhension simple de la programmation des sockets PHP
Le contenu principal de cet article concerne une compréhension simple de la programmation des sockets php. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer
php. La programmation socket est relativement difficile à comprendre. Cependant, il suffit de comprendre la relation entre plusieurs fonctions de socket, et Il ne devrait pas être difficile de comprendre les rôles qu'ils jouent. De l'avis de l'auteur, la programmation socket consiste en fait à établir le client et le serveur d'un service réseau. as Le client et le serveur de mysql sont identiques. Il vous suffit de comprendre en quoi consistent le client et le serveur de mysql. , vous devriez pouvoir comprendre ce que je vais dire ci-dessous.
Concernant les protocoles réseau impliqués dans la programmation socket, qu'est-ce que TCP ? Laissez-moi vous montrer le schéma du processus d'établissement d'un socketsocket : 🎜> J'ai travaillé dur pour voler cette photo aux autres. Vous devez la regarder attentivement. En même temps, je voudrais également exprimer ma gratitude à l'auteur dont la capture d'écran m'a été volée. voler votre modèle, et j'espère que vous ne vous en souciez 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 socket établit-il une connexion ? Comme mentionné ci-dessus, le processus d'établissement d'une connexion est essentiellement le même que la connexion entre le client et le serveur de mysql. La différence avec mysql c'est que le serveur et le client de mysql ont été édités pour nous, il suffit d'appliquer C'est tout. Cependant, le moment critique est venu, prise il ne nous fournit rien, la seule chose qu'il nous fournit c'est : des dizaines de prise Fonction.
L'implication est que la programmation socket nous oblige à créer nous-mêmes le serveur et le client, c'est-à-dire ``socketProgrammation``—— signifie que nous devons en construire un nous-mêmes, similaire au serveur mysql et les applications clientes.
En parlant de ça, je veux 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 nous-mêmes les fonctions de socket pour créer notre propre suite de protocoles réseau. se connecter à l'application ? Il n'y a pas de solution au mal de tête. Si vous avez besoin de votre propre application, vous devez toujours vous occuper du socket. 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 socket, j'aimerais vous laisser jeter un œil à plusieurs fonctions clés de socket . Laissez-moi d’abord vous expliquer leurs fonctions respectives. Sinon, si quelqu'un qui n'a aucune base en programmation socket lit ceci, j'ai peur que vous sautiez cet article de manière décisive et que vous en appreniez davantage sur à partir de maintenant. a développé une phobie. Haha, j'en ai dit plus.
Fonctions clés du socket1 :
socket_create($netparamètre1, $streamparamètre 2, $protocoleparamètres3)
Fonction : Créer un socket socket mot Pour parler franchement, est un flux de données réseau .
Valeur de retour : une socket, ou false, une erreur de paramètre est émise E_WARNINGAvertissement
Le manuel en ligne de php le dit plus clairement :
socket_createCrée et renvoie un socket, également appelé nœud de communication. Une connexion réseau typique se compose de 2 sockets, l'une fonctionnant du côté client et l'autre fonctionnant du côté serveur.
La phrase ci-dessus est copiée du manuel en ligne php. 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 : IPv4 Protocole réseau. TCP et UDP peuvent tous deux utiliser ce protocole. C'est généralement utilisé, vous savez.
AF_INET6 : IPv6 Protocole réseau. TCP et UDP peuvent tous deux utiliser ce protocole.
AF_UNIX : Protocole de communication local. IPC (communication inter-processus) à hautes performances et à faible coût.
Paramètres 2 : Flux de socket, les options sont :
Sock_stream sock_dgram sock_seqpacket sock_raw SOCK_RDM.
Ici, nous expliquons uniquement les deux premiers :
SOCK_STREAM TCP Socket de protocole.
SOCK_DGRAM UDP socket de protocole.
Pour plus d'informations, veuillez créer un lien ici : http://php.net/manual/zh/function.socket-create.php
Paramètres 3 : protocole protocole, les options sont :
SOL_TCP:Protocole TCP .
SOL_UDP : UDP protocole.
On voit d'ici qu'en fait, le deuxième paramètre et le troisième paramètre de la fonction socket_create sont liés.
Par exemple, si votre premier paramètre utilise le protocole IPv4 : AF_INET, Ensuite, le deuxième paramètre s'applique au socket TCP : SOCK_STREAM,
Ensuite, le troisième paramètre doit utiliser SOL_TCP, Cela ne devrait pas être difficile à comprendre.
TCP socket de protocole, bien sûr vous ne pouvez utiliser que le protocole TCP, non ? Si vous utilisez le socket UDP, alors je ne dirai pas comment choisir le troisième paramètre, haha, vous savez.
Fonctions clés 2 :
socket_connect($socketparamètre1, $ipparamètre2, $portParamètres3)
Fonction : Connectez une socket, la valeur de retour est true ou faux
Paramètres 1 : socket_create Valeur de retour de la fonction
Paramètres2 :ipadresse
Paramètres3 : Numéro de port
Fonctions clés 3 :
socket_bind($socket paramètre1, $ipparamètre2, $portparamètre3)
Fonction : Lier un socket, la valeur de retour est true ou false
Paramètres1 : socket_create valeur de retour de la fonction
Paramètres2:ipadresse
Paramètres3 : numéro de port
Fonctions clés 4 :
socket_listen($socketparamètre1,$backlog paramètre2)
Fonction : Écoutez une socket, la valeur de retour est true ou false
Paramètre1 : La valeur de retour de la fonction de socket_create
Paramètres2 : Nombre maximum de prises d'écoute
Fonctions clés5 :
socket_accept($socket)
Fonction : Recevoir les informations sur la ressource de socket, renvoyer la ressource d'informations de socket avec succès, l'échec est faux
Paramètre : socket_create Valeur de retour de la fonction
Fonctions clés 6 :
socket_read(paramètre $socket 1, paramètre $length 2)
Fonction : Lire les informations sur les ressources du socket,
Valeur de retour : conversion réussie des ressources de socket en informations de chaîne, l'échec est faux
Paramètre 1 : socket_create ou socket_accept
Paramètre 2 : La longueur de la chaîne lue
Fonctions des touches 7 :
socket_write($socket paramètre1,$msgparamètre2,$strlenParamètres3)
Fonction : Écrire des données dans le socket
Valeur de retour : renvoie avec succès la longueur en octets de la chaîne, l'échec est false
Paramètre 1 : socket_create ou socket_accept valeur de retour de la fonction
Paramètre2 : Chaîne
Paramètres 3 : La longueur de la chaîne
Fonction clé 8:
socket_close($socket)
Fonction : Fermer la socket
Valeur de retour : le succès renvoie true, l'échec renvoie false
Paramètres : socket_create ou socket_accept
Ces huit La fonction est la fonction principale de socket. Vous trouverez ci-dessous deux autres fonctions importantes :
socket_last_error($socket), les paramètres sont La valeur de retour de socket_create est utilisée pour obtenir le dernier numéro de code d'erreur du socket. La valeur de retour est socketcode. socket_strerror($code), le paramètre est la valeur de retour de la fonction socket_last_error, récupère le code Informations sur la chaîne, la valeur de retour est également le message d'erreur du socket Ces deux fonctions sont toujours très importantes dans la programmation socket , lors de l'écriture de la programmation socket, je pense qu'il faut quand même l'utiliser, surtout pour les novices, il peut être utilisé pour le débogage Je dois crier trois fois, haha.
Script serveur, D:vhosttestsocketserver_socket.php
<?php //创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); /*绑定接收的套接流主机和端口,与客户端相对应*/ if(socket_bind($socket,'127.0.0.1',8888) == false){ echo 'server bind fail:'.socket_strerror(socket_last_error()); /*这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址*/ } //监听套接流 if(socket_listen($socket,4)==false){ echo 'server listen fail:'.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 'server receive is :'.$string.PHP_EOL;//PHP_EOL为php的换行预定义常量 if($string != false){ $return_client = 'server receive is : '.$string.PHP_EOL; /*向socket_accept的套接流写入信息,也就是回馈信息给socket_bind()所绑定的主机客户端*/ socket_write($accept_resource,$return_client,strlen($return_client)); /*socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息*/ }else{ echo 'socket_read is fail'; } /*socket_close的作用是关闭socket_create()或者socket_accept()所建立的套接流*/ socket_close($accept_resource); } }while(true); socket_close($socket);Conseils : Veuillez noter que 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
客户端脚本,D:\vhost\test\socket\client_socket.php
<?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,'127.0.0.1',8888) == false){ echo 'connect fail massege:'.socket_strerror(socket_last_error()); }else{ $message = 'l love you 我爱你 socket'; //转为GBK编码,处理乱码问题,这要看你的编码情况而定,每个人的编码都不同 $message = mb_convert_encoding($message,'GBK','UTF-8'); //向服务端写入字符串信息 if(socket_write($socket,$message,strlen($message)) == false){ echo 'fail to write'.socket_strerror(socket_last_error()); }else{ echo 'client write success'.PHP_EOL; //读取服务端返回来的套接流信息 while($callback = socket_read($socket,1024)){ echo 'server return message is:'.PHP_EOL.$callback; } } } socket_close($socket);//工作完毕,关闭套接流
怎么测试这两个脚本呢?
首先打开windows的dos窗口,就是cmd黑窗口,然后,运行php D:\vhost\test\socket\server_socket.php,
让服务端的的黑窗口持续运行的,
其次,php的客户端脚本可以通过浏览器运行,也可以再开一个cmd黑窗口运行
php D:\vhost\test\socket\client_socket.php
在这里请注意:php这个运行命名必须加入windows的环境变量中,假如不知道怎么加,
请进入php运行命令目录用绝对命令运行,也可以百度把php命令加入环境变量中
这里是我的情况,你的文件地址可能和我不一样,请按照你的地址情况来操作,否则,后果自负,呵呵
上面已经说过了,socket编程必须要有服务端才能交流,所以服务端的黑窗口是必须让它持续开着的。
Post-scriptum ajouté :
socket_set_option($socketparamètres1 ,$level paramètre2,$optname paramètre3, $optval paramètre4)
La fonction de cette fonction est de définir les options de flux de données pour le socket, et c'est également une fonction très importante.
Paramètres1 : socket_create ou socket_accept
Paramètres2 : SOL_SOCKET, il semble que seule cette option
paramètre 3 soit liée au paramètre 4 ,
Les paramètres 3 peuvent être : SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEO
Expliquez :
SO_REUSEADDR Laissez le port de socket être à nouveau utilisé immédiatement après sa libération
Paramètres3 Si tel est le cas, le paramètre 4 peut être vrai ou faux
SO_RCVTIMEO est le délai d'attente maximum de la ressource de réception du socket
SO_SNDTIMEO est le socket Le délai d'attente maximum du mot ressource d'envoi
Paramètre 3 Si ce sont ces deux-là, alors le paramètre 4 est un tableau comme celui-ciarray('sec'=>1,'usec'=>500000)
Le délai d'attente maximum est défini dans le tableau, mais l'un est en secondes et l'autre en microsecondes, l'effet est le même
Recommandations associées :
Contenu de communication du socket php
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!