Maison >développement back-end >tutoriel php >Exemple détaillé de programmation de socket en php

Exemple détaillé de programmation de socket en php

小云云
小云云original
2018-03-29 11:51:497036parcourir

À 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_TCPTCP 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ètres2ipadresse

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



<?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);

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


<?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);//工作完毕,关闭套接流


   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

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