socket, également communément appelé « socket », est utilisé pour décrire une adresse IP et un port, et est un handle vers un chaîne de communication. Les applications envoient généralement des requêtes au réseau ou répondent aux requêtes du réseau via des « sockets ». Socket n'est ni un programme ni un protocole. C'est juste un ensemble d'API abstraites pour la couche de communication fournie par le système d'exploitation. Le chapitre précédent a présenté quelques fonctions courantes et importantes du socket php , qui seront utilisées dans la communication par socket.
La communication nécessite un serveur et un client :
Serveur : Utilisez php pour initialiser le socket, puis associez un port pour surveiller le port. Appelez accept pour bloquer et attendez que le client se connecte.
Client : Le client initialise un socket puis se connecte au serveur Si la connexion réussit, la connexion entre le client et le serveur est établie. Le client envoie une demande de données, le serveur reçoit la demande et traite la demande, puis envoie les données de réponse au client, le client lit les données, puis ferme la connexion et l'interaction se termine.
Client-serveur sont des applications qui peuvent interagir entre elles. L'interaction entre le client et le serveur nécessite une connexion. La programmation socket est chargée d’établir des connexions interactives entre les applications.
Processus de connexion au socket
En fonction de la manière dont la connexion est initiée et de la cible à laquelle le socket local est connecté, le processus de connexion entre les sockets peut être divisé en trois étapes : Surveillance du serveur, demande client, confirmation de connexion.
(1) Surveillance du serveur : le socket côté serveur ne localise pas le socket client spécifique, mais est en état d'attente de connexion et surveille l'état du réseau en temps réel.
(2) Requête client : fait référence à une demande de connexion faite par le socket du client, et la cible à connecter est le socket du serveur. Pour ce faire, le socket du client doit d'abord décrire le socket du serveur auquel il souhaite se connecter, indiquer l'adresse et le numéro de port du socket côté serveur, puis faire une demande de connexion au socket côté serveur.
(3) Confirmation de connexion : signifie que lorsque le socket côté serveur écoute ou reçoit la demande de connexion du socket client, il répond à la demande du socket client et établit un nouveau Thread, envoie la description de le socket côté serveur au client. Une fois que le client confirme cette description, la connexion est établie. Le socket côté serveur reste à l’état d’écoute et continue de recevoir des demandes de connexion d’autres sockets clients.
Le principe du socket peut se référer à l'organigramme ci-dessous :
Ce qui suit est une implémentation simple de la communication socket via un exemple de code serveur-client L'ensemble du processus
1. Son code serveur :
<?php set_time_limit(0); //限制执行时间 0为不限制 $ip = '127.0.0.1'; $port = 8001;//端口 /** socket通信整个过程 socket_create //创建一个套接字 socket_bind //给套接字绑定 ip 和端口 socket_listen //监听套接字上的连接 socket_accept //接受一个socket连接 socket_read //接收客户端 发送的数据 socket_write //将数据写到 socket 缓存 向客户端发送 socket_close //关闭套接字资源 */ if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) { echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n"; } if(($ret = socket_bind($sock,$ip,$port)) < 0) { echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n"; } if(($ret = socket_listen($sock,4)) < 0) { echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n"; } $count = 0; do { if (($msgsock = socket_accept($sock)) < 0) { echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; break; } else { //发到客户端 $msg ="测试成功!\n"; socket_write($msgsock, $msg, strlen($msg)); echo "测试成功了啊\n"; $buf = socket_read($msgsock,8192); $talkback = "收到的信息:$buf\n"; echo $talkback; if(++$count >= 5){ break; }; } //echo $buf; socket_close($msgsock); } while (true); socket_close($sock); ?>
Exécutez le fichier php, Après exécution, le résultat ne doit pas être visible, vous pouvez utilisez netstat -ntlp Vérifiez si le port 8001 est occupé. Voir photo ci-dessous.
2. Son code client :
<?php error_reporting(E_ALL); set_time_limit(0); echo "socket通信客户端\n"; $port = 8001;//端口 $ip = "127.0.0.1";//ip /** socket连接整个过程 socket_create //建立一个socket 连接 socket_connect // 开始一个socket连接 连接服务端 socket_write //将数据写入缓存 向服务端发送 socket_read// 读取服务端的结果 socket_close // 关闭套接字资源 */ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket < 0) { echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "OK.\n"; } echo "试图连接 '$ip' 端口 '$port'...\n"; $result = socket_connect($socket, $ip, $port); if ($result < 0) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n"; }else { echo "连接OK\n"; } $in = "Ho\r\nfirst blood\r\n"; $out = ''; if(!socket_write($socket, $in, strlen($in))) { echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "发送到服务器信息成功!\n"; echo "发送的内容为:<font color='red'>$in</font> <br>"; } while($out = socket_read($socket, 8192)) { echo "接收服务器回传信息成功!\n"; echo "接受的内容为:",$out; } echo "关闭SOCKET...\n"; socket_close($socket); echo "关闭OK\n"; ?>
Regardez le résultat de la fenêtre du serveur :
Remarque : Les caractéristiques du langage PHP déterminent qu'à cet égard, php ne convient qu'au client, pas au serveur.
【Tutoriels associés recommandés】
1. "php.cn Dugu Jiujian (4) - Tutoriel vidéo PHP "
2. ensemble de tutoriels sur la programmation PHP de l'entrée à la maîtrise
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!