Maison  >  Article  >  développement back-end  >  Compréhension simple de la programmation des sockets PHP

Compréhension simple de la programmation des sockets PHP

不言
不言original
2018-04-23 16:21:531109parcourir

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_TCPProtocole 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ètres2ipadresse

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


Compréhension simple de la programmation des sockets 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);
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

Compréhension simple de la programmation des sockets PHP Vous devez d'abord exécuter socket_bind, puis socket_listen, et enfin socket_accept

    客户端脚本,D:\vhost\test\socket\client_socket.php

 


Compréhension simple de la programmation des sockets 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);//工作完毕,关闭套接流

Compréhension simple de la programmation des sockets PHP

 

     怎么测试这两个脚本呢?

    首先打开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!

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
Article précédent:filtrage de sécurité phpArticle suivant:filtrage de sécurité php