Le contenu de cet article concerne les fonctions couramment utilisées dans la programmation de socket php et la mise en œuvre d'une simple interaction c/s. Le contenu est très détaillé. Les amis dans le besoin peuvent s'y référer.
Explication officielle de Socket :
La solution la plus couramment utilisée en programmation réseau est le modèle Client/Serveur (client/serveur). Dans ce scénario, l'application client demande des services au programme serveur. Un programme de service écoute généralement les demandes de service à une adresse connue, c'est-à-dire que le processus de service reste inactif jusqu'à ce qu'un client fasse une demande de connexion à l'adresse du service. A ce moment, le programme de service est « réveillé » et fournit des services au client – réagissant de manière appropriée à la demande du client. Afin de faciliter la programmation réseau de ce modèle Client/Serveur, au début des années 1990, Microsoft et plusieurs autres sociétés ont développé conjointement un ensemble d'interfaces de programmation réseau sous WINDOWS, à savoir la spécification Windows Sockets. Il ne s'agit pas d'un protocole réseau, mais d'un réseau. interface de programmation. Un ensemble d'interfaces de programmation réseau ouvertes sous Windows qui prennent en charge plusieurs protocoles. Désormais, Winsock est devenu fondamentalement indépendant du protocole. Vous pouvez utiliser Winsock pour appeler des fonctions de plusieurs protocoles, mais le protocole TCP/IP est plus couramment utilisé. Socket fournit en fait un port de communication dans l’ordinateur via lequel il peut communiquer avec n’importe quel ordinateur doté d’une interface Socket. Les applications transmettent sur le réseau et reçoivent des informations via cette interface Socket
Nous pouvons simplement comprendre Socket comme un canal qui peut connecter différentes applications informatiques sur le réseau, transférant un tas de données depuis Si l'extrémité A du canal est jeté, il sortira par l'extrémité B du tuyau (il peut aussi sortir par les extrémités C, D, E, F...).
注意
: Nous utiliserons différents mots pour modifier le socket dans différents contextes. Il vous suffit d'en avoir une idée, car le socket lui-même n'a pas d'entité réelle
La communication par socket se déroulera en plusieurs étapes : création de socket, liaison de socket, surveillance de socket, envoi et réception de socket et fermeture de socket. Ci-dessous, nous répertorions les étapes de la programmation réseau PHP Plusieurs fonctions couramment utilisées. sont les plus couramment utilisés et les éléments essentiels sont expliqués plus en détail.
TODO : Créer une nouvelle ressource socket
Prototype de fonction : resource socket_create ( int $domain , int $type , int $protocol )
Il contient trois paramètres, comme suit :
domaine : AF_INET, AF_INET6, AF_UNIX, la signification de AF
est address family
, ce qui signifie famille d'adresses. Nous utilisons couramment ipv4, ipv6
type : SOCK_STREAM, SOCK_DGRAM, etc., le plus couramment utilisé est SOCK_STREAM
, le type SOCKET basé sur le flux d'octets, qui est également le type utilisé par le protocole TCP
protocole : SOL_TCP, SOL_UDP C'est le protocole de transmission spécifique utilisé. Pour une transmission générale fiable, nous choisissons TCP, et pour la transmission des données de jeu, nous choisissons généralement le protocole UDP
TODO : lier le socket créé. ressource vers une adresse IP et un port spécifiques
prototype de fonction : bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )
Il contient trois paramètres, comme suit :
socket : La ressource socket créée à l'aide socket_create
peut être considéré C'est l'identifiant correspondant au socket
adresse : adresse ip
port : le numéro du port d'écoute, le le port par défaut du serveur WEB est 80
TODO : Surveiller les opérations d'envoi et de réception des ressources socket à une adresse précise
Prototype de fonction : bool socket_listen ( resource $socket [, int $backlog = 0 ] )
Il contient deux paramètres, respectivement comme suit :
socket : ressource de socket créée à l'aide de socket_create
backlog : longueur maximale de la file d'attente en attente de traitement
TODO : Après écoute, recevoir une nouvelle connexion à venir Si la connexion est établie avec succès, une nouvelle socket. handle sera renvoyé (vous pouvez le comprendre comme un processus enfant, généralement le parent. Le processus est utilisé pour recevoir de nouvelles connexions et le processus enfant est responsable d'une communication spécifique)
Prototype de fonction : resource socket_accept ( resource $socket )
socket : ressource de socket créée à l'aide de socket_create
TODO : envoyer les données spécifiées au tube de socket correspondant
Fonction prototype : int socket_write ( resource $socket , string $buffer [, int $length ] )
socket : ressource de socket créée à l'aide de socket_create
buffer : données écrites dans la socket
ressource
longueur : Contrôle l'écriture dans La longueur de socket
dans la ressource buffer
Si la longueur est supérieure à la capacité de buffer
, la capacité de buffer
est prise comme.
TODO : Récupérer les données transmises
Prototype de fonction : int socket_read ( resource $socket , int $length )
socket : Créé à l'aide de socket_create
La longueur de la ressource socket
length : La longueur du socket
dans la ressource buffer
TODO : Fermer la ressource socket
prototype de fonction : void socket_close ( resource $socket )
socket : La ressource générée par socket_accept
ou socket_create
ne peut pas être utilisée pour fermer le stream
ressource
Étant donné que le processus de création d'un SOCKET consiste toujours à socket, lier et écouter, PHP fournit une fonction très pratique pour créer, lier des ports et écouter aux ports à la fois
Prototype de fonction : resource stream_socket_server ( string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context ]]]] )
local_socket : nom du protocole://adresse:numéro de port
errno : code d'erreur
errstr : message d'erreur
flags : n'utiliser qu'une partie de la fonction
Contexte : Utiliser stream_context_create
Le contexte de flux de ressources créé par la fonction
Basé sur le ci-dessus, nous pouvons facilement le construire Programme de communication Socket (ici, j'espère que les lecteurs pourront créer un répertoire séparé tel que socket
car nous créerons beaucoup de fichiers plus tard. Nous éditons d'abord un programme serveur server.php
comme suit :
<?php date_default_timezone_set("Asia/Shanghai"); error_reporting(E_NOTICE ); /* 确保在连接客户端时不会超时 */ set_time_limit(0); $ip = '127.0.0.1'; $port = 8090; /* +------------------------------- * @socket通信整个过程 +------------------------------- * @socket_create * @socket_bind * @socket_listen * @socket_accept * @socket_read * @socket_write * @socket_close +-------------------------------- */ /*---------------- 以下操作都是手册上的 -------------------*/ if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) { echo "socket_create() Why failure is:".socket_strerror($sock)."\n"; } if(($ret = socket_bind($sock,$ip,$port)) < 0) { echo "socket_bind() Why failure is:".socket_strerror($ret)."\n"; } if(($ret = socket_listen($sock,4)) < 0) { echo "socket_listen() Why failure is:".socket_strerror($ret)."\n"; } echo "Start time:".date('Y-m-d H:i:s') . PHP_EOL; echo "Listening at ".$ip.':'.$port.PHP_EOL; do { /* 创建新的连接 */ if (($msgsock = socket_accept($sock)) < 0) { echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; break; } else { # 连接成功输出 Socket id $i = (int)$msgsock; echo "welcome client $i"; # 向客户端通信(反馈) $msg ="连接成功!\n"; socket_write($msgsock, $msg, strlen($msg)); } socket_close($msgsock); } while (true); socket_close($sock); ?>
puis Editer un programme client client.php
comme suit :
<?php set_time_limit(0); $port = 8090; $ip = "127.0.0.1"; /* +------------------------------- * 客户端 socket 连接整个过程 +------------------------------- * @socket_create * @socket_connect * @socket_write * @socket_read * @socket_close +-------------------------------- */ /** * @socket_connect:客户端发起套接字连接 * @param socket resource $socket 创建的$socket资源 * @param address string SOCK_STREAM IP地址|Unix套接字 * @param port int 端口 */ /** * @socket_create:创建并返回一个套接字 * @param domain string AF_INET IPV4 网络协议 * @param type string SOCK_STREAM 全双工字节流(可用的套接字类型) * @param protocol string SOL_TCP 具体协议(IPV4下的TCP协议) * @param return 套接字 */ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket < 0) { echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "try to connect '$ip' port: '$port'...\n"; } $result = socket_connect($socket, $ip, $port); #socket_connect的返回值应该是boolean值 if ($result < 0) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n"; }else { # 连接成功输出提示信息 echo "connect successfully\n"; # 向服务端发送数据 socket_write($socket, " hello ", 1024); # 获取服务端数据 $result = socket_read($socket, 1024); echo "服务器回传数据为:" . $result; echo "CLOSE SOCKET...\n"; socket_close($socket); echo "CLOSE OK\n"; } ?>
Ensuite, nous ouvrons le terminal (ligne de commande) et entrons dans le répertoire du fichier à exécuter en séquence :
php server.php php client.php
L'effet d'exécution est le suivant :
注意
Lorsque le serveur est à l'écoute, le processus est suspendu et aucun d'autres opérations peuvent être effectuées. Vous devrez peut-être démarrer un autre terminal pour exécuter le programme client
Recommandations associées :
Comment PHP et MySql implémentent-ils la lecture des données d'arrière-plan (Code) ?
Thinkphp5 utilise le minuteur Workerman pour explorer régulièrement le contenu du siteCe 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!