Maison >développement back-end >tutoriel php >Exemple détaillé de programmation de socket en php
À propos des protocoles réseau impliqués dans la programmation socket, qu'est-ce que TCP, UDP ah, quoisocket poignée de main à trois, etc. Il existe des explications très détaillées sur ces protocoles réseau sur Internet, je n'entrerai pas dans les détails ici , prenez simplement une capture d'écransocketLaissez-vous jeter un œil au schéma du processus d'établissement d'un socket :
🎜> 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. gratitude envers moi-même pour avoir volé votre photo. Le modèle exprime mes excuses, 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``—— nous oblige à créer une application serveur et client similaire à mysql. 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, je vous laisse quand même jeter un œil à socket Plusieurs fonctions clés de , 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ètre2, $protocoleparamètre3) 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 rend plus clair : 🎜>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. Seuls les deux premiers sont expliqués ici : SOCK_STREAMTCP Prise 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:TCP protocole. 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, alors le deuxième paramètre utilise TCPSocket : SOCK_STREAM, Ensuite, le troisième paramètre doit utiliser SOL_TCP, Cela ne devrait pas être difficile à comprendre. TCP socket de protocole, bien entendu seul le protocole TCP peut être utilisé, Oui ou 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ètre3) Fonction : Connectez une socket, la valeur de retour est true ou false Paramètres1 : La valeur de retour de la fonction de socket_create Paramètres2:ipadresse Paramètres3 : numéro de port Fonctions clés 3 : socket_bind($socketparamètre1,$ipparamètre2,$portparamètre3) Fonction : Lier un socket, la valeur de retour est true ou false Paramètre1 : socket_create valeur de retour de la fonction Paramètres2 : ipadresse Paramètres 3 : Numéro de port Fonction clé 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 Clé fonctions 5 : socket_accept($socket) Fonction : Recevoir les informations sur les ressources du socket, et renvoyer les informations sur les ressources du socket en cas de succès, et en cas d'échec faux Paramètre : la fonction renvoie la valeur de socket_create Fonctions clés6 : socket_read($socket paramètre 1, $length paramètre 2) Fonction : lire les informations sur les ressources du socket, Valeur de retour : convertir avec succès la ressource du socket en informations de chaîne, l'échec est false Paramètre 1 : La valeur de retour de la fonction de socket_create ou socket_accept Paramètre 2 : La longueur de la chaîne lue Clé fonctions 7 : socket_write($socketparamè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 faux Paramètre 1 : socket_create ou socket_accept valeur de retour de la fonction paramètres 2 : Chaîne Paramètres 3 : La longueur de la chaîne Fonctions des touches 8 : socket_close($socket) Fonction : Fermer la prise Valeur de retour : le succès renvoie true, l'échec renvoie false paramètres : La valeur de retour de la fonction socket_create ou socket_accept Ces huit fonctions sont les fonctions principales de socket Voici deux autres fonctions importantes : socket_last_error($socket), paramètres It. est la valeur de retour de socket_create. Sa fonction est d'obtenir le dernier numéro de code d'erreur du socket. La valeur de retour du socket est code socket_strerror($code), le paramètre est la valeur de retour de la fonction socket_last_error, récupérez le code information de chaîne, la valeur de retour est aussi le message d'erreur du socket Ces deux fonctions sont toujours très importantes dans socket programmation. Surtout, 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 Voici le code, faites attention, veuillez lire attentivement mes commentaires, les commentaires sont très importants, 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 : 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 Il faut d'abord exécuter socket_bind, puis socket_listen, et enfin socket_accept Script client, D: vhosttestsocketclient_socket.php Comment tester ces deux scripts ? Ouvrez d'abord la fenêtre dos de Windows, qui est la fenêtre noire cmd, puis exécutez php D:vhosttestsocketserver_socket.php, Laissez le serveur La fenêtre noire continue de s'exécuter, Deuxièmement, le script client php peut être exécuté via le navigateur, ou vous pouvez ouvrir une autre fenêtre noire cmd pour l'exécuter php D:vhosttestsocketclient_socket.php Veuillez noter ici : le nom courant de php doit être ajouté à la variable d'environnement Windows si vous ne savez pas comment le faire. ajoutez-le, Veuillez entrer dans le répertoire de la commande en cours d'exécution php et exécutez-le avec une commande absolue. Vous pouvez également ajouter la commande php à la variable d'environnement dans Baidu C'est ma situation, votre adresse de dossier peut être différente de la mienne, merci d'opérer selon votre adresse, sinon, vous êtes responsable des conséquences, haha Ci-dessus Comme mentionné précédemment, la programmation socket nécessite qu'un serveur communique, la fenêtre noire du serveur doit donc rester ouverte. Post-scriptum : socket_set_option($socketparamètre1 , $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 ce soit la seule option Les paramètres 3 sont liés aux paramètres 4, Les paramètres3 peuvent être :SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEO Explication ici : SO_REUSEADDR Il permet de réutiliser le port socket immédiatement après sa libération Paramètres 3 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 la ressource d'envoi du socket Le délai d'attente maximum Paramètre 3 Si ce sont ces deux-là, alors le paramètre 4Est un tableau comme çaarray('sec'=>1,'usec'=>500000) Le délai d'expiration maximum est défini dans le tableau. Cependant, l'un est en secondes et l'autre en microsecondes. L'effet est le même Recommandations associées : Explication détaillée de la programmation des sockets en 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);
<?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);//工作完毕,关闭套接流
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!