Die ursprüngliche englische Bedeutung von socket ist „Loch“ oder „Socket“. Als Prozesskommunikationsmechanismus von BSD UNIX wird die letztere Bedeutung angenommen. Wird zur Beschreibung von IP-Adressen und Ports verwendet und ist ein Handle für eine Kommunikationskette. Hosts im Internet führen im Allgemeinen mehrere Dienstsoftware aus und stellen mehrere Dienste gleichzeitig bereit. Jeder Dienst öffnet einen Socket und bindet ihn an einen Port.
Die PHP-Socket-Programmierung ist relativ schwer zu verstehen. Wir müssen jedoch nur einige Socket-Funktionen verstehen Um die Beziehung zwischen ihnen und den Rollen, die sie spielen, zu verstehen, geht es bei der Socket-Programmierung tatsächlich darum, einen Client und einen Server für einen Netzwerkdienst einzurichten, der dem Client und dem Dienst von MySQL ähnelt Solange Sie verstehen, was der Client und der Server von MySQL sind, sollten Sie verstehen, worüber ich im Folgenden 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 nur einen Sockel ausschneiden, um einen Sockel zu erstellen:
Ich möchte mich auch beim Autor bedanken, dessen Screenshot mir gestohlen wurde. Ich entschuldige mich dafür, dass ich Ihr Muster gestohlen habe. Ich hoffe, es ist dir egal. Ich bin zu faul, Bilder zu zeichnen (eigentlich bedeutet das, dass ich mir meiner Zeichenfähigkeiten nicht sicher bin, haha).
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 den TCP-Protokoll-Socket betrifft, kann er 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, 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: Einen Socket binden, der Rückgabewert ist wahr oder falsch
Parameter 1: Funktion Rückgabewert von socket_create
Parameter 2: IP-Adresse
Parameter 3: Portnummer
Tastenfunktion 4:
socket_listen($socket Parameter 1,$ backlog Parameter 2)
Funktion: Einen Socket abhören, der Rückgabewert ist wahr oder falsch
Parameter 1: Der Funktionsrückgabewert von socket_create
Parameter 2: Maximale Anzahl von Listening-Sockets
Tastenfunktion 5:
socket_accept($socket)
Funktion: Empfangen Sie die Ressourceninformationen des Sockets und geben Sie den Socket erfolgreich zurück. Informationsressourcen, Fehler ist falsch
Parameter: Funktionsrückgabewert von socket_create
Tastenfunktion 6:
socket_read($socket Parameter 1, $length Parameter 2)
Funktion: Lesen die Ressourceninformationen des Sockets,
Rückgabewert: Konvertieren Sie die Socket-Ressource erfolgreich in Zeichenfolgeninformationen, der Fehler ist falsch
Parameter 1: socket_create oder Der Funktionsrückgabewert von socket_accept
Parameter 2: Die Länge der gelesenen Zeichenfolge
Tastenfunktion 7:
socket_write($socket Parameter 1, $msg Parameter 2, $ strlen Parameter 3)
Funktion : Daten in den Socket schreiben
Rückgabewert: Gibt die Bytelänge der Zeichenfolge zurück, wenn erfolgreich, false bei Fehler
Parameter 1: Der Funktionsrückgabewert von socket_create oder socket_accept
Parameter 2: String
Parameter 3: Die Länge des Strings
Tastenfunktion 8:
socket_close($ socket)
Funktion: Schließen Sie die socket
Rückgabewert: true bei Erfolg, false bei Fehler
Parameter: Funktionsrückgabewert von socket_create oder socket_accept
Diese acht Funktionen sind die Kernfunktionen von socket zwei weitere wichtige Funktionen
Socket_last_error($socket). Seine Funktion besteht darin, den letzten Fehlercode des Sockets zu erhalten.
socket_strerror($code), der Parameter ist der Rückgabewert der Funktion socket_last_error, ruft die String-Informationen des Codes ab, der Rückgabewert ist die Fehlermeldung des Sockets
Diese beiden Funktionen sind in Socket immer noch sehr wichtig Beim Schreiben der Socket-Programmierung muss man sie meiner Meinung nach immer noch verwenden, insbesondere für Anfänger. Sie können zum Debuggen verwendet werden.
Das ist der Code, aufgepasst, bitte lesen Sie meine Kommentare sorgfältig durch 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,'127.0.0.1',8888) == false){ echo 'server bind fail:'.socket_strerror(socket_last_error()); /*这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址*/ } //监听套接流 if(socket_listen($socket,4)==false){ echo 'server listen fail:'.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 'server receive is :'.$string.PHP_EOL;//PHP_EOL为php的换行预定义常量 if($string != false){ $return_client = 'server receive is : '.$string.PHP_EOL; /*向socket_accept的套接流写入信息,也就是回馈信息给socket_bind()所绑定的主机客户端*/ socket_write($accept_resource,$return_client,strlen($return_client)); /*socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息*/ }else{ echo 'socket_read is fail'; } /*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 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, erfordert die Socket-Programmierung einen Server zur Kommunikation, daher muss das schwarze Fenster auf dem Server offen gehalten werden.
Postscript:
socket_set_option($socket Parameter 1, $level Parameter 2, $optname Parameter 3, $optval Parameter 4)
Die Funktion dieser Funktion ist das Setzen Die Schnittstelle legt die Datenflussoptionen fest, was ebenfalls eine sehr wichtige Funktion ist.
Parameter 1: Funktionsrückgabewert von socket_create oder socket_accept
Parameter 2: SOL_SOCKET, es scheint, dass diese Option die einzige ist
Parameter 3 hängt mit Parameter 4 zusammen,
Parameter 3 kann sein: SO_REUSEADDR SO_RCVTIMEO S0_SNDTIMEO
Erklärung:
SO_REUSEADDR Ermöglicht die Wiederverwendung des Socket-Ports sofort nach seiner Freigabe
Wenn Parameter 3 dies ist, kann Parameter 4 wahr oder falsch sein
SO_RCVTIMEO Es ist die maximale Timeout-Zeit der Empfangsressource des Sockets
SO_SNDTIMEO Es ist die maximale Timeout-Zeit des Sockets Senderessource
Wenn Parameter 3 diese beiden sind, dann ist Parameter 4 ein Array array('sec'=>1,'usec'=>500000)
Array Sie Alle legen die maximale Timeout-Zeit fest, aber eine ist in Sekunden und die andere in Mikrosekunden, und der Effekt ist der gleiche
Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe es wird für alle nützlich sein.
Verwandte Empfehlungen:
Detaillierte Erklärung der in PHP häufig verwendeten magischen Methoden
PHP Detaillierte Erklärung zur Verwendung von Cookies auf Chinesisch
PHPs Methode zur Lösung chinesischer verstümmelter Zeichen
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der Socket-Nutzung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!