Heim  >  Artikel  >  Backend-Entwicklung  >  Einfaches Verständnis der PHP-Socket-Programmierung

Einfaches Verständnis der PHP-Socket-Programmierung

不言
不言Original
2018-04-23 16:21:531075Durchsuche

Der Hauptinhalt dieses Artikels ist ein einfaches Verständnis der PHP-Socket-Programmierung. Jetzt kann ich ihn mit Ihnen teilen.

PHP Socket-Programmierung ist relativ schwer zu verstehen. Wir müssen jedoch nur die Beziehung zwischen mehreren Funktionen von Socket verstehen. und Es sollte nicht schwer sein, die Rolle zu verstehen, die sie spielen. Die Socket-Programmierung dient tatsächlich dazu, den Client und den Server eines Netzwerkdienstes einzurichten as Der Client und der Server von MySQL sind gleich. Sie müssen nur verstehen, worum es beim Client und Server von MySQL geht. , sollten Sie verstehen können, was ich unten sagen werde.

Was ist TCP in Bezug auf die Netzwerkprotokolle, die bei der Socket--Programmierung zum Einsatz kommen? Lassen Sie mich Ihnen das Prozessdiagramm zum Einrichten eines Sockets zeigenSocket: 🎜> Ich habe hart daran gearbeitet, dieses Bild von anderen zu stehlen. Gleichzeitig möchte ich mich bei dem Autor bedanken, für den ich mich entschuldige Ich habe Ihr Muster gestohlen und 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, das heißt ``SocketProgrammierung``—— bedeutet, dass wir selbst einen erstellen müssen, der dem MySQL-Server ähnelt und Client-Anwendungen.

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, möchte ich Ihnen einen Blick auf einige Schlüsselfunktionen von Socket werfen . Lassen Sie mich Ihnen zunächst die jeweiligen Funktionen erläutern. Ansonsten befürchte ich, dass Sie, wenn jemand, der keine Kenntnisse in der Socket-Programmierung hat, diesen Artikel ü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, $streamparameter 2, $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 sagt es deutlicher:

 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.

Der Parameter 1 ist: Netzwerkprotokoll,

Was sind die Netzwerkprotokolle? 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 erklären wir nur die ersten beiden:

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 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 Protokoll IPv4 verwendet: AF_INET, Dann gilt der zweite Parameter für den TCP-Socket: SOCK_STREAM,

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

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

Tastenfunktionen 2:

 socket_connect($socketparameter1, $ipparameter2, $portParameter3)

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

  Parameter 1: socket_create Rückgabewert der Funktion

  Parameter2:IPAdresse

  Parameter3: Portnummer

Tastenfunktionen 3:

socket_bind($socket Parameter1, $ipParameter2, $portParameter3)

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

Parameter1: Funktionsrückgabewert von socket_create

Parameter2 :IPAdresse

Parameter3: Portnummer

Tastenfunktionen 4:

 socket_listen($socketparameter1,$backlog parameter2)

Funktion: Hören Sie auf einen Socket, der Rückgabewert ist true oder false

 Parameter1: Der Funktionsrückgabewert von socket_create

  Parameter2: Maximale Anzahl von Hörbuchsen

 Schlüsselfunktionen5:

 socket_accept($socket)

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

  Parameter: socket_create Funktionsrückgabewert

Tastenfunktionen 6:

  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. Der Fehler ist falsch

Parameter 1: socket_create oder socket_accept

  Parameter 2: Die Länge des gelesenen Strings

  Tastenfunktionen 7:

  socket_write($ socketParameter1,$msgParameter2,$strlen Parameter3)

Funktion: Daten in den Socket schreiben

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

Parameter 1: socket_create oder socket_accept Funktionsrückgabewert

 Parameter2: String

Parameter 3: Die Länge der Zeichenfolge

Tastenfunktion 8

socket_close($socket)

Funktion: Schließen Sie den Socket

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

Parameter: socket_create oder socket_accept

Diese acht The Die Funktion ist die Kernfunktion von socket. Nachfolgend sind zwei weitere wichtige Funktionen aufgeführt:

 socket_last_error($socket), die Parameter sind Der Rückgabewert von socket_create wird verwendet, um die letzte Fehlercodenummer des Sockets zu erhalten. Der Rückgabewert ist socketcode

  socket_strerror($code), der Parameter ist der Rückgabewert der Funktion socket_last_error, um den Code abzurufen String-Informationen, der Rückgabewert ist auch die Socket-Fehlermeldung

Diese beiden Funktionen sind in der Socket-Programmierung immer noch sehr wichtig. Beim Schreiben von Socket-Programmierung denke ich, dass man es immer noch verwenden muss, insbesondere für Anfänger, es kann zum Debuggen verwendet werden

Ich muss dreimal schreien, haha.

Serverskript, D:vhosttestsocketserver_socket.php


Einfaches Verständnis der PHP-Socket-Programmierung

  
<?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);
Tipps: Bitte beachten Sie das Die Ausführungsreihenfolge der drei oben genannten Funktionen socket_bind, socket_listen und socket_accept kann nicht geändert werden, d. h.

Einfaches Verständnis der PHP-Socket-Programmierung Sie müssen zuerst socket_bind, dann socket_listen und schließlich socket_accept ausführen

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

 


Einfaches Verständnis der PHP-Socket-Programmierung

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

Einfaches Verständnis der PHP-Socket-Programmierung

 

     怎么测试这两个脚本呢?

    首先打开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编程必须要有服务端才能交流,所以服务端的黑窗口是必须让它持续开着的。

 

Nachtrag hinzugefügt:

socket_set_option($socketparameters1 ,$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 nur diese Option

Parameter 3 mit Parameter 4 ,

Parameter 3 können sein: SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEO

Erklären Sie:

SO_REUSEADDR Lassen Sie den Socket-Port sofort nach der Freigabe wieder verwendet werden

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

SO_RCVTIMEO ist die maximale Zeitüberschreitung der empfangenden Ressource des Sockets

SO_SNDTIMEO ist die maximale Zeitüberschreitung des Sockets der Wortsenderessource

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

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

Verwandte Empfehlungen:

PHP-Socket-Kommunikationsinhalte

Das obige ist der detaillierte Inhalt vonEinfaches Verständnis der PHP-Socket-Programmierung. 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
Vorheriger Artikel:PHP-SicherheitsfilterungNächster Artikel:PHP-Sicherheitsfilterung