Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Socket-Programmierung

PHP-Socket-Programmierung

高洛峰
高洛峰Original
2016-11-19 10:31:35834Durchsuche

Die Socket-Programmierung von PHP ist relativ schwer zu verstehen. Solange wir jedoch die Beziehung zwischen mehreren Socket-Funktionen und deren Rollen verstehen, sollte es nach Meinung des Autors nicht schwer sein, sie zu verstehen Ein Netzwerkdienst-Client und -Server ist dasselbe wie der MySQL-Client und -Server. Solange Sie verstehen, was der MySQL-Client und -Server ist, sollten Sie verstehen, worüber ich sprechen werde.

Über die an der Socket-Programmierung beteiligten Netzwerkprotokolle wie TCP, UDP, Socket-Drei-Wege-Handshake usw. Im Internet werde ich nicht näher darauf eingehen. Ich werde einfach einen Sockel ausschneiden, um einen Sockel zu erstellen. Schauen Sie sich das Bild des Verbindungsvorgangs an:

PHP-Socket-Programmierung

Dieses Bild wurde durch harte Arbeit von jemand anderem gestohlen . Sie müssen es sich genau ansehen. Gleichzeitig möchte ich mich bei dem Autor bedanken, dessen Screenshots mir gestohlen wurden, und ich hoffe, dass es Ihnen egal ist über sie. Ich bin zu faul, Bilder zu zeichnen (eigentlich bedeutet das, dass ich mir meiner Zeichenfähigkeiten nicht sicher bin, haha).

Wie stellt der Socket eine Verbindung her? Wie oben erwähnt, ist der Prozess des Verbindungsaufbaus im Wesentlichen derselbe wie die Verbindung zwischen MySQL-Client und -Server. Der Unterschied zu MySQL besteht darin, dass der Server und der Client von MySQL für uns bearbeitet wurden. Wir müssen sie nur anwenden. Der kritische Moment ist jedoch gekommen. Das Einzige, was es uns bietet, sind: Dutzende von Socket-Funktionen.

Die Implikation ist, dass wir bei der Socket-Programmierung den Server und den Client selbst erstellen müssen. Mit anderen Worten: Bei der „Socket-Programmierung“ müssen wir einen Server und einen Client erstellen, die der MySQL-Terminalanwendung ähneln.

Apropos, ich würde gerne fragen: Glauben Sie, dass diese Steckdose Kopfschmerzen bereitet? Es wird weder ein Server noch ein Client erstellt, den wir anwenden können. Wir müssen die Socket-Funktion selbst verwenden und unsere eigene Netzwerkprotokoll-Socket-Anwendung erstellen. Gegen die Kopfschmerzen können Sie nichts tun. Wenn Sie eine eigene Anwendung benötigen, müssen Sie sich immer noch mit Steckdosen befassen. 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 einen Blick auf einige Schlüsselfunktionen von Socket werfen und Ihnen ihre jeweiligen Funktionen erklären. Andernfalls befürchte ich, dass Sie, wenn jemand, der keine Ahnung von Socket-Programmierung hat, dies liest, diesen Artikel nach der Lektüre entschieden überspringt und von nun an eine Phobie gegenüber Sockets entwickelt. Haha, sag mehr.

  Schlüsselfunktion 1 des Sockets:

  socket_create($net Parameter 1, $stream Parameter 2, $protocol Parameter 3)

  Funktion: Erstellen Sie einen Socket-Socket Im Klartext handelt es sich um einen Netzwerkdatenfluss.

Rückgabewert: ein Socket oder false, bei Parameterfehlern wird eine E_WARNING-Warnung ausgegeben

Das PHP-Online-Handbuch macht es klarer:

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

Der obige Satz wurde 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,

 Was sind die Netzwerkprotokolle? Seine Optionen sind die folgenden drei:

 AF_INET: IPv4-Netzwerkprotokoll. Sowohl TCP als auch UDP können dieses Protokoll verwenden. Das wird allgemein verwendet, wissen Sie.

AF_INET6: IPv6-Netzwerkprotokoll. Sowohl TCP als auch UDP können dieses Protokoll verwenden.

 AF_UNIX: Lokales Kommunikationsprotokoll. Leistungsstarker und kostengünstiger IPC (Inter-Process Communication).

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_STREAM TCP-Protokoll-Socket.

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, Optionen sind:

SOL_TCP: TCP-Protokoll.

SOL_UDP: UDP-Protokoll.

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

Wenn Ihr erster Parameter beispielsweise das IPv4-Protokoll verwendet: AF_INET und der zweite Parameter dann den TCP-Socket verwendet: SOCK_STREAM,

Dann muss der dritte Parameter SOL_TCP verwendet werden, dies sollte nicht der Fall sein schwer zu verstehen sein.

Was TCP-Protokoll-Sockets betrifft, können Sie natürlich nur das TCP-Protokoll verwenden, oder? Wenn Sie UDP-Sockets verwenden, werde ich nicht sagen, wie Sie den dritten Parameter auswählen, haha, wissen Sie.

Tastenfunktion 2:

socket_connect($socket Parameter 1, $ip Parameter 2, $port Parameter 3)

Funktion: Einen Socket verbinden Socket, der Rückgabewert ist wahr oder falsch

Parameter 1: Funktionsrückgabewert von socket_create

Parameter 2: IP-Adresse

Parameter 3: Portnummer

Tastenfunktion 3:

socket_bind($socket Parameter 1, $ip Parameter 2, $port Parameter 3)

Funktion: Binden Sie einen Socket und geben Sie den Wert zurück wahr oder falsch

Parameter 1: Funktionsrückgabewert von socket_create

Parameter 2: IP-Adresse

Parameter 3: Portnummer

Tastenfunktion 4:

socket_listen($socket Parameter 1, $backlog Parameter 2)

Funktion: Auf einen Socket hören, der Rückgabewert ist wahr oder falsch

Parameter 1: Funktionsrückgabewert von socket_create

Parameter 2: Maximale Anzahl der Listening-Sockets

Tastenfunktion 5:

socket_accept($ socket)

Funktion: Socket-Ressourceninformationen empfangen, Socket-Informationsressource erfolgreich zurückgeben, Fehler ist falsch

Parameter: Funktionsrückgabewert von socket_create

Tastenfunktion 6:

socket_read($socket)

Funktion: Lesen Sie die Ressourceninformationen des Sockets.

Rückgabewert: Verbinden Sie den Socket erfolgreich. Word-Ressourcen werden in Zeichenfolgeninformationen konvertiert, ein Fehler liegt vor false

Parameter: Funktionsrückgabewert von socket_create oder socket_accept

Tastenfunktion 7:

socket_write ($socket Parameter 1, $msg Parameter 2, $strlen-Parameter 3)

Funktion: Daten in den Socket schreiben

Rückgabewert: Die Bytelänge der Zeichenfolge erfolgreich zurückgeben, Fehler ist falsch

Parameter: Funktionsrückgabewert von socket_create oder socket_accept

Tastenfunktion 8:

socket_close($socket)

Funktion: Socket schließen

Rückgabewert : Bei Erfolg true zurückgeben, bei Fehler false

Parameter: Funktionsrückgabewert von socket_create oder socket_accept

Diese acht Funktionen sind die Kernfunktionen von socket. Nachfolgend sind zwei weitere aufgeführt Wichtige Funktionen

 socket_strerror() Der Parameter ist der Rückgabewert von socket_create. $code), der Parameter ist der Rückgabewert der Funktion socket_last_error, ruft die Zeichenfolgeninformationen des Codes ab, der Rückgabewert ist die Fehlermeldung des Sockets

Diese beiden Funktionen sind in der Socket-Programmierung immer noch sehr wichtig. Beim Schreiben der Socket-Programmierung muss man sie meiner Meinung nach immer noch nutzen, insbesondere für Anfänger. Sie können zum Debuggen verwendet werden

 

  Das Folgende ist Code, aufgepasst, bitte lesen Sie meine Kommentare vorsichtig, Kommentare sind sehr wichtig, Kommentare sind sehr wichtig, Kommentare sind sehr wichtig, wichtige Dinge sollten dreimal gerufen werden, haha.

Server-Skript, D:vhosttestsocketserver_socket.php

Client-Skript, D:vhosttestsocketclient_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);

Wie teste ich diese beiden Skripte?
<?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,&#39;127.0.0.1&#39;,8888) == false){
        echo &#39;connect fail massege:&#39;.socket_strerror(socket_last_error());
    }else{
        $message = &#39;l love you 我爱你 socket&#39;;
        //转为GBK编码,处理乱码问题,这要看你的编码情况而定,每个人的编码都不同
        $message = mb_convert_encoding($message,&#39;GBK&#39;,&#39;UTF-8&#39;);
        //向服务端写入字符串信息

        if(socket_write($socket,$message,strlen($message)) == false){
            echo &#39;fail to write&#39;.socket_strerror(socket_last_error());

        }else{
            echo &#39;client write success&#39;.PHP_EOL;
            //读取服务端返回来的套接流信息
            while($callback = socket_read($socket,1024)){
                echo &#39;server return message is:&#39;.PHP_EOL.$callback;
            }
        }
    }
    socket_close($socket);//工作完毕,关闭套接流

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

Lassen Sie das schwarze Fenster des Servers weiterlaufen,

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

 php D:vhosttestsocketclient_socket.php

Bitte beachten Sie hier: Der Name des PHP-Laufs muss sein. Fügen Sie ihn den Umgebungsvariablen von Windows hinzu.

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

Dies ist meine Situation. Ihre Dateiadresse unterscheidet sich möglicherweise von meiner. Bitte gehen Sie entsprechend Ihrer Adresssituation vor. Andernfalls sind Sie für die Folgen verantwortlich. haha ​​

Wie oben erwähnt, muss die Socket-Programmierung über einen Server zur Kommunikation verfügen Das schwarze Fenster auf dem Server muss offen gehalten werden.

Postscript hinzugefügt:

socket_set_option($socket Parameter 1, $level Parameter 2, $optname Parameter 3, $optval Parameter 4)

Dies Die Funktion besteht darin, Datenflussoptionen für den Socket festzulegen, und es handelt sich auch um eine sehr wichtige Funktion.

Parameter 1: Funktionsrückgabewert von socket_create oder socket_accept

Parameter 2: SOL_SOCKET, es scheint, dass diese Option die einzige ist

Parameter 3 und Parameter 4 hängen zusammen,

Parameter 3 kann sein: SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEO


Erklärung:

SO_REUSEADDR Ermöglicht die erneute Verwendung des Socket-Ports unmittelbar nach seiner Freigabe

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

SO_RCVTIMEO Es ist für den Socket The maximales Timeout für den Empfang von Ressourcen

SO_SNDTIMEO ist das maximale Timeout für das Senden von Ressourcen des Sockets

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

Die maximale Timeout-Zeit ist im Array festgelegt, aber eine ist in Sekunden und die andere in Mikrosekunden, der Effekt ist der gleiche


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
Vorheriger Artikel:PHP-LernvoraussetzungenNächster Artikel:PHP-Lernvoraussetzungen