Heim >Backend-Entwicklung >PHP-Tutorial >Detailliertes Beispiel für Socket-Programmierung in PHP

Detailliertes Beispiel für Socket-Programmierung in PHP

小云云
小云云Original
2018-03-29 11:51:496988Durchsuche

Über die Netzwerkprotokolle, die an der Socket--Programmierung beteiligt sind, was ist TCP, UDP? Ah, wasSocketDrei-Wege-Handshake usw. Es gibt sehr detaillierte Erklärungen dieser Netzwerkprotokolle im Internet, ich werde hier nicht darauf eingehen , machen Sie einfach einen ScreenshotSocketSehen Sie sich das Prozessdiagramm zum Einrichten eines Sockets an:

🎜> Ich habe hart daran gearbeitet, dieses Bild von anderen zu stehlen. Gleichzeitig möchte ich dem Autor, dessen Screenshot mir gestohlen wurde, meinen Dank aussprechen Ich bin mir selbst dafür dankbar, dass ich Ihr Bild gestohlen habe. Ich hoffe, dass es Ihnen egal ist. Ich bin zu faul, Bilder zu zeichnen (eigentlich bedeutet das, dass ich mir meiner Zeichenfähigkeiten nicht sicher bin, haha).

  Wie stellt Socket eine Verbindung her? Wie oben erwähnt, ist der Prozess des Verbindungsaufbaus im Wesentlichen derselbe wie die Verbindung zwischen dem Client und dem Server von

MySQL. Der Unterschied zu MySQL besteht darin, dass der Server und der Client von MySQL für uns bearbeitet wurden, wir müssen uns nur bewerben. Das ist es. Doch der kritische Moment ist gekommen, Steckdose es versorgt uns mit nichts, das Einzige, was es uns liefert, ist: Dutzende von Steckdose Funktion.

Die Implikation ist, dass die Socket-Programmierung erfordert, dass wir den Server und den Client selbst erstellen, also ``SocketProgrammierung``—— erfordert, dass wir eine Server- und Clientanwendung ähnlich wie MySQL erstellen.

Apropos, ich möchte fragen: Glauben Sie, dass diese Steckdose Kopfschmerzen bereitet? Es erstellt weder einen Server noch einen Client, den wir anwenden können. Wir müssen die Funktionen von Socket selbst verwenden, um eine eigene Netzwerkprotokollsuite zu erstellen mit der Anwendung verbinden? Es gibt keine Lösung für das Problem. Wenn Sie eine eigene Anwendung benötigen, müssen Sie sich immer noch mit der Buchse auseinandersetzen. Haha, das ist nur ein Exkurs, ich werde nicht viel sagen, kommen wir zum Punkt.

Bevor Sie von der Socket-Programmierung verwirrt werden, lasse ich Sie dennoch einen Blick auf Socket werfen Einige Schlüsselfunktionen von . Lassen Sie mich Ihnen zunächst die jeweiligen Funktionen erläutern. Ansonsten befürchte ich, dass jemand, der keine Kenntnisse in der Socket-Programmierung hat, diesen Artikel entschieden überspringt und sich von nun an etwas über mit Socket beschäftigt hat eine Phobie entwickelt. Haha, ich habe mehr gesagt.

 Schlüsselfunktionen der Steckdose1:

  socket_create($netparameter1, $streamparameter2, $protocolParameter3)

Funktion: Erstellen Sie ein Socket-Socket--Wort . Kurz gesagt: ist ein Netzwerkdatenstrom .

Rückgabewert: ein Socket oder falsch, Parameterfehler wird ausgegeben E_WARNINGWarnung

Das Online-Handbuch für php macht es klarer:

🎜>socket_createErstellt einen Socket, auch Kommunikationsknoten genannt, und gibt ihn zurück. Eine typische Netzwerkverbindung besteht aus 2 Sockets, von denen einer auf der Clientseite und der andere auf der Serverseite ausgeführt wird.

Der obige Satz ist aus dem php Online-Handbuch kopiert. Sehen Sie, dass die Bedeutung hier genau mit der von Client und Server übereinstimmt, die ich oben wiederholt erwähnt habe? hehe.

Parameter 1 ist: Netzwerkprotokoll,

Welche Netzwerkprotokolle gibt es? Seine Optionen sind die folgenden drei:

 AF_INET: IPv4 Netzwerkprotokoll. TCP und UDP können beide dieses Protokoll verwenden. Das wird allgemein verwendet, wissen Sie.

 AF_INET6: IPv6 Netzwerkprotokoll. TCP und UDP können beide dieses Protokoll verwenden.

 AF_UNIX: Lokales Kommunikationsprotokoll. IPC (Interprozesskommunikation) mit hoher Leistung und geringen Kosten.

Parameter 2: Socket-Stream, Optionen sind:

 SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW <.> SOCK_RDM.

Hier werden nur die ersten beiden erklärt:

SOCK_STREAMTCP Protokoll-Buchse.

 SOCK_DGRAM  UDP Protokoll-Socket.

Für weitere Informationen verlinken Sie bitte hier: http://php.net/manual/zh/function.socket-create.php

  Parameter 3: Protokoll Protokoll, die Optionen sind:

 SOL_TCP:TCP Protokoll.

 SOL_UDP: UDP Protokoll.

Hier ist ersichtlich, dass tatsächlich der zweite Parameter und der dritte Parameter der Funktion socket_create zusammenhängen.

Wenn Ihr erster Parameter beispielsweise das IPv4-Protokoll verwendet: AF_INET, dann verwendet der zweite Parameter TCPSocket: SOCK_STREAM,

Dann muss der dritte Parameter SOL_TCP, Das sollte nicht schwer zu verstehen sein.

 TCP Protokoll-Socket, natürlich kann nur das TCP Protokoll verwendet werden, Ja oder nein? Wenn Sie den UDP-Socket verwenden, werde ich nicht sagen, wie Sie den dritten Parameter auswählen, haha, wissen Sie.

Tastenfunktion 2:

 socket_connect($socketparameter1,$ipparameter2, $portParameter3)

Funktion: Einen Socket verbinden, der Rückgabewert ist true oder false

  Parameter1: Der Funktionsrückgabewert von socket_create

Parameter2IPAdresse

Parameter3: Portnummer

Tastenfunktionen 3:

 socket_bind($socketparameter1,$ipparameter2,$portparameter3)

Funktion: Einen Socket binden, der Rückgabewert ist true oder false

  Parameter1: socket_createFunktionsrückgabewert

  Parameter2: IPAdresse

Parameter 3: Portnummer

Tastenfunktion 4 :

  socket_listen($socketparameter1,$backlog parameter2)

Funktion: Auf einen Socket hören, der Rückgabewert ist true oder false

🎜 >Parameter1: Der Funktionsrückgabewert von socket_create

  Parameter2: Maximale Anzahl von Hörbuchsen

Schlüssel Funktionen 5:

  socket_accept($socket)

  Funktion: Empfangen Sie die Ressourceninformationen des Sockets und geben Sie bei Erfolg die Informationsressourcen des Sockets zurück, und bei Fehler falsch

  Parameter: Funktionsrückgabewert von socket_create

 Schlüsselfunktionen6:

 socket_read($socket Parameter 1, $length Parameter 2)

Funktion: Lesen Sie die Ressourceninformationen des Sockets.

Rückgabewert: Konvertieren Sie die Socket-Ressource erfolgreich in Zeichenfolgeninformationen. Es liegt ein Fehler vor false

  Parameter 1: Der Funktionsrückgabewert von socket_create oder socket_accept

Parameter 2: Die Länge der gelesenen Zeichenfolge

Schlüssel Funktionen 7:

  socket_write($socketparameter1, $msgparameter2 , $strlenParameter3)

Funktion: Daten in den Socket schreiben

Rückgabewert: Gibt die Bytelänge der Zeichenfolge erfolgreich zurück, Fehler ist falsch

Parameter 1: socket_create oder socket_accept Funktionsrückgabewert

  Parameter 2 : Zeichenfolge

Parameter 3: Die Länge der Zeichenfolge

Tastenfunktionen 8:

socket_close($socket )

Funktion: Steckdose schließen

Rückgabewert: Erfolg gibt wahr zurück, Fehler gibt falsch zurück

Parameter : Der Funktionsrückgabewert von socket_create oder socket_accept

Diese acht Funktionen sind die Kernfunktionen von socket. Hier sind zwei weitere wichtige Funktionen:

 socket_last_error($socket), Parameter It ist der Rückgabewert von socket_create. Seine Funktion besteht darin, die letzte Fehlercodenummer des Sockets zu erhalten. Der Rückgabewert socket ist code

  socket_strerror($code), der Parameter ist der Rückgabewert der Funktion socket_last_error, holen Sie sich das Code String-Informationen, der Rückgabewert ist auch die Socket-Fehlermeldung

Diese beiden Funktionen sind in Socket Programmierung Wichtig ist, dass man es beim Schreiben von Socket-Programmierung immer noch verwenden muss, insbesondere für Anfänger. Es kann zum Debuggen verwendet werden

 

Das Folgende ist der Code, aufgepasst, bitte lesen Sie meine Kommentare sorgfältig durch, Kommentare sind sehr wichtig, Kommentare sind sehr wichtig, Kommentare sind sehr wichtig, wichtige Dinge sollten dreimal gerufen werden, haha.

Serverskript, 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);

Tipp: Bitte beachten Sie, dass die Ausführungsreihenfolge der drei oben genannten Funktionen socket_bind, socket_listen und socket_accept nicht geändert werden kann, also

Es ist notwendig, zuerst socket_bind auszuführen, dann socket_listen und schließlich socket_accept

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


   Wie teste ich diese beiden Skripte?

Öffnen Sie zuerst das DOS-Fenster von Windows, das cmd-schwarze Fenster, und führen Sie dann PHP D:vhosttestsocketserver_socket.php aus.

Let Der Server Das schwarze Fenster läuft weiter,

Zweitens kann das PHP-Client-Skript über den Browser ausgeführt werden, oder Sie können ein anderes schwarzes CMD-Fenster öffnen, um

auszuführen

php D:vhosttestsocketclient_socket.php

Bitte beachten Sie hier: Der PHP-Laufname muss zur Windows-Umgebungsvariablen hinzugefügt werden, wenn Sie nicht wissen, wie man ihn hinzufügt it,

Bitte geben Sie das PHP-Ausführungsbefehlsverzeichnis ein und führen Sie es mit einem absoluten Befehl aus. Sie können den PHP-Befehl auch zur Umgebungsvariablen in Baidu hinzufügen

 Das ist meine Situation, Ihre Dateiadresse unterscheidet sich möglicherweise von meiner. Bitte gehen Sie entsprechend Ihrer Adresse vor, andernfalls sind Sie für die Folgen verantwortlich, haha

  Oben Wie bereits erwähnt, erfordert die Socket-Programmierung einen Server zur Kommunikation, daher muss das schwarze Fenster auf dem Server geöffnet bleiben.

Nachtrag:

socket_set_option($socketParameter1 , $level Parameter2, $optname Parameter3, $optval Parameter4)

Die Funktion dieser Funktion besteht darin, Datenflussoptionen für den Socket festzulegen, und es ist auch eine sehr wichtige Funktion.

Parameter1: socket_create oder socket_acceptRückgabewert der Funktion

Parameter2: SOL_SOCKET, es scheint, dass dies die einzige Option ist

Parameter 3 beziehen sich auf Parameter 4,

Parameter3 können sein:SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEO

Erklärung hier:

SO_REUSEADDR Ermöglicht die Wiederverwendung des Socket-Ports sofort nach der Freigabe

Parameter 3 Wenn dies der Fall ist, kann der Parameter 4 wahr oder falsch sein

SO_RCVTIMEO ist die maximale Zeitüberschreitung der Empfangsressource des Sockets

SO_SNDTIMEO ist die maximale Zeitüberschreitung der Socket-Senderessource

Parameter 3 Wenn es diese beiden sind, dann ist der Parameter 4Ist ein Array soarray('sec'=>1,'usec'=>500000)

Die maximale Zeitüberschreitungszeit wird im Array festgelegt. Eine Angabe erfolgt jedoch in Sekunden und die andere in Mikrosekunden. Der Effekt ist derselbe.

Verwandte Empfehlungen:

Detaillierte Erklärung der Socket-Programmierung in PHP

Das obige ist der detaillierte Inhalt vonDetailliertes Beispiel für Socket-Programmierung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn