Der Inhalt dieses Artikels befasst sich mit häufig verwendeten Funktionen in der PHP-Socket-Programmierung und der Implementierung einfacher C/S-Interaktionen. Ich hoffe, dass er Ihnen helfen kann.
Offizielle Erklärung von Socket:
Die am häufigsten verwendete Lösung in der Netzwerkprogrammierung ist das Client/Server-Modell (Client/Server). In diesem Szenario fordert die Clientanwendung Dienste vom Serverprogramm an. Ein Dienstprogramm wartet normalerweise auf Anfragen für den Dienst an einer bekannten Adresse. Das heißt, der Dienstprozess bleibt inaktiv, bis ein Client eine Verbindungsanfrage an die Adresse des Dienstes stellt. In diesem Moment ist das Serviceprogramm „erwacht“ und stellt dem Client Services zur Verfügung – und reagiert dabei angemessen auf die Anfrage des Clients. Um die Netzwerkprogrammierung dieses Client/Server-Modells zu erleichtern, entwickelten Microsoft und mehrere andere Unternehmen Anfang der 1990er Jahre gemeinsam eine Reihe von Netzwerkprogrammierschnittstellen unter WINDOWS, nämlich die Windows Sockets-Spezifikation. Dabei handelt es sich nicht um ein Netzwerkprotokoll, sondern um ein Netzwerk Programmierschnittstelle Eine Reihe offener Netzwerkprogrammierschnittstellen unter Windows, die mehrere Protokolle unterstützen. Jetzt ist Winsock grundsätzlich protokollunabhängig. Sie können Winsock zum Aufrufen von Funktionen mehrerer Protokolle verwenden, das TCP/IP-Protokoll wird jedoch häufiger verwendet. Socket stellt tatsächlich einen Kommunikationsanschluss im Computer bereit, über den er mit jedem Computer kommunizieren kann, der über eine Socket-Schnittstelle verfügt. Anwendungen übertragen im Netzwerk und empfangen Informationen über diese Socket-Schnittstelle.
Wir können Socket einfach als eine Pipe verstehen, die verschiedene Computeranwendungen im Netzwerk verbinden und eine Menge Daten vom A-Ende der Pipe übertragen kann Wenn es hineingeworfen wird, kommt es am B-Ende des Rohrs heraus (es kann auch an den Enden C, D, E, F... herauskommen).
注意
: Wir werden unterschiedliche Wörter verwenden, um Socket in verschiedenen Kontexten zu modifizieren. Sie müssen nur eine Vorstellung davon haben, da Socket selbst keine echte Entität hat
Die Socket-Kommunikation durchläuft mehrere Phasen: Socket-Erstellung, Socket-Bindung, Socket-Überwachung, Socket-Senden und -Empfangen und Socket-Schließen. Nachfolgend listen wir die Schritte in der PHP-Netzwerkprogrammierung auf. Einige häufig verwendete Funktionen werden am häufigsten verwendet und sind im Folgenden näher erläutert.
TODO: Erstellen Sie eine neue Socket-Ressource
Funktionsprototyp: resource socket_create ( int $domain , int $type , int $protocol )
Es enthält drei Parameter wie folgt:
Domäne: AF_INET, AF_INET6, AF_UNIX, AF
bedeutet address family
, was bedeutet, dass wir häufig IPv4, IPv6
Typ: SOCK_STREAM, SOCK_DGRAM usw. verwenden. Das am häufigsten verwendete ist SOCK_STREAM
, der auf dem Byte-Stream basierende SOCKET-Typ, der auch vom TCP-Protokoll verwendet wird.
Protokoll: SOL_TCP, SOL_UDP Dies ist das spezifische Übertragungsprotokoll Für die allgemeine zuverlässige Übertragung wählen wir TCP und für die Übertragung von Spieldaten im Allgemeinen das UDP-Protokoll
TODO: Binden Sie die erstellte Socket-Ressource an a spezifische IP-Adresse und Port
Funktionsprototyp: bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )
Es enthält drei Parameter wie folgt:
Socket: Die Socket-Ressource, die mit socket_create
erstellt wurde kann berücksichtigt werden Es ist die ID, die dem Socket entspricht
Adresse: IP-Adresse
Port: Die Nummer des Abhörports, der Standardport von der WEB-Server ist 80
TODO: Überwachen Sie die Sende- und Empfangsvorgänge von Socket-Ressourcen an einer bestimmten Adresse
Funktionsprototyp: bool socket_listen ( resource $socket [, int $backlog = 0 ] )
Es enthält jeweils zwei Parameter wie folgt:
Socket: Socket-Ressource erstellt mit socket_create
Backlog: maximale Länge der Warteschlange, die auf die Verarbeitung wartet
TODO: Nach dem Abhören eine bevorstehende neue Verbindung empfangen. Wenn die Verbindung erfolgreich hergestellt wurde, wird ein neues Socket-Handle erstellt zurückgegeben (Sie können es als untergeordneten Prozess verstehen, normalerweise als übergeordneter Prozess. Der Prozess wird verwendet, um neue Verbindungen zu empfangen, und der untergeordnete Prozess ist für die spezifische Kommunikation verantwortlich.)
Funktionsprototyp: resource socket_accept ( resource $socket )
Socket: Socket-Ressource erstellt mit socket_create
TODO: Die angegebenen Daten an die entsprechende Socket-Pipe senden
Funktionsprototyp: int socket_write ( resource $socket , string $buffer [, int $length ] )
Socket: Socket-Ressource erstellt mit socket_create
Puffer: In die socket
-Ressource
in der Ressource socket
. Wenn die Länge größer als die Kapazität von buffer
ist, wird die Kapazität von buffer
als buffer
angenommen
TODO: Die übertragenen Daten abrufen
Funktionsprototyp: int socket_read ( resource $socket , int $length )
socket: Erstellt mit socket_create
Die Länge der Socket-Ressource
length: Die Länge der socket
in der buffer
-Ressource
TODO: Socket-Ressource schließen
Funktionsprototyp: void socket_close ( resource $socket )
Socket: Die von socket_accept
oder socket_create
generierte Ressource kann nicht zum Schließen des stream
verwendet werden Ressource
Da der Prozess der Erstellung eines SOCKETs immer aus Socket, Bindung und Abhören besteht, bietet PHP eine sehr praktische Funktion zum Erstellen, Binden und Abhören von Ports an Ports auf einmal
Funktionsprototyp: resource stream_socket_server ( string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context ]]]] )
local_socket: Protokollname://Adresse:Portnummer
errno: Fehlercode
errstr: Fehlermeldung
Flags: Nur einen Teil der Funktion verwenden
Kontext: Verwenden Sie stream_context_create
Der von der Funktion erstellte Ressourcenflusskontext
Basierend auf Mit der obigen Funktion können wir problemlos ein Socket-Kommunikationsprogramm erstellen (hier hoffe ich, dass Leser ein separates Verzeichnis wie socket
erstellen können, da wir später viele Dateien erstellen werden). Zuerst bearbeiten wir ein Serverprogramm server.php
wie folgt:
<?php date_default_timezone_set("Asia/Shanghai"); error_reporting(E_NOTICE ); /* 确保在连接客户端时不会超时 */ set_time_limit(0); $ip = '127.0.0.1'; $port = 8090; /* +------------------------------- * @socket通信整个过程 +------------------------------- * @socket_create * @socket_bind * @socket_listen * @socket_accept * @socket_read * @socket_write * @socket_close +-------------------------------- */ /*---------------- 以下操作都是手册上的 -------------------*/ if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) { echo "socket_create() Why failure is:".socket_strerror($sock)."\n"; } if(($ret = socket_bind($sock,$ip,$port)) < 0) { echo "socket_bind() Why failure is:".socket_strerror($ret)."\n"; } if(($ret = socket_listen($sock,4)) < 0) { echo "socket_listen() Why failure is:".socket_strerror($ret)."\n"; } echo "Start time:".date('Y-m-d H:i:s') . PHP_EOL; echo "Listening at ".$ip.':'.$port.PHP_EOL; do { /* 创建新的连接 */ if (($msgsock = socket_accept($sock)) < 0) { echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; break; } else { # 连接成功输出 Socket id $i = (int)$msgsock; echo "welcome client $i"; # 向客户端通信(反馈) $msg ="连接成功!\n"; socket_write($msgsock, $msg, strlen($msg)); } socket_close($msgsock); } while (true); socket_close($sock); ?>
und dann ein anderes bearbeiten. Das Client-Programm client.php
lautet wie folgt:
<?php set_time_limit(0); $port = 8090; $ip = "127.0.0.1"; /* +------------------------------- * 客户端 socket 连接整个过程 +------------------------------- * @socket_create * @socket_connect * @socket_write * @socket_read * @socket_close +-------------------------------- */ /** * @socket_connect:客户端发起套接字连接 * @param socket resource $socket 创建的$socket资源 * @param address string SOCK_STREAM IP地址|Unix套接字 * @param port int 端口 */ /** * @socket_create:创建并返回一个套接字 * @param domain string AF_INET IPV4 网络协议 * @param type string SOCK_STREAM 全双工字节流(可用的套接字类型) * @param protocol string SOL_TCP 具体协议(IPV4下的TCP协议) * @param return 套接字 */ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket < 0) { echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "try to connect '$ip' port: '$port'...\n"; } $result = socket_connect($socket, $ip, $port); #socket_connect的返回值应该是boolean值 if ($result < 0) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n"; }else { # 连接成功输出提示信息 echo "connect successfully\n"; # 向服务端发送数据 socket_write($socket, " hello ", 1024); # 获取服务端数据 $result = socket_read($socket, 1024); echo "服务器回传数据为:" . $result; echo "CLOSE SOCKET...\n"; socket_close($socket); echo "CLOSE OK\n"; } ?>
Dann öffnen wir das Terminal (Befehlszeile) und geben das Dateiverzeichnis ein, um es nacheinander auszuführen:
php server.php php client.php
Der laufende Effekt ist wie folgt:
注意
Wenn der Server lauscht, wird der Prozess angehalten und es können keine anderen Vorgänge ausgeführt werden. Möglicherweise müssen Sie ein anderes Terminal starten, um das Client-Programm auszuführen
Verwandte Empfehlungen:
Wie implementieren PHP und MySql das Lesen von Hintergrunddaten (Code)
Thinkphp5 verwendet den Worker-Timer, um den Inhaltscode der Website regelmäßig zu crawlenDas obige ist der detaillierte Inhalt vonHäufig verwendete Funktionen bei der PHP-Socket-Programmierung und der Implementierung einfacher C/S-Interaktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!