Socket, auch allgemein als „Socket“ bekannt, wird zur Beschreibung einer IP-Adresse und eines Ports verwendet und ist ein Handle für eine Kommunikationskette. Anwendungen stellen normalerweise Anfragen an das Netzwerk oder antworten auf Netzwerkanfragen über „Sockets“. Socket ist weder ein Programm noch ein Protokoll, sondern lediglich eine Reihe abstrakter APIs für die Kommunikationsschicht, die vom Betriebssystem bereitgestellt werden. Im vorherigen Kapitel wurden einige allgemeine und wichtige Funktionen von php socket vorgestellt, die in der Socket-Kommunikation verwendet werden.
Kommunikation erfordert Server und Client:
Server: Verwenden Sie PHP, um den Socket zu initialisieren und dann einen Port zu binden, um den Port zu überwachen. Rufen Sie „accept“ auf, um zu blockieren, und warten Sie, bis der Client eine Verbindung herstellt.
Client: Der Client initialisiert einen Socket und verbindet sich dann mit dem Server. Wenn die Verbindung erfolgreich ist, wird die Verbindung zwischen dem Client und dem Server hergestellt. Der Client sendet eine Datenanforderung, der Server empfängt die Anforderung und verarbeitet sie, sendet dann die Antwortdaten an den Client, der Client liest die Daten und schließt schließlich die Verbindung und die Interaktion endet.
Client-Server sind Anwendungen, die miteinander interagieren können. Die Interaktion zwischen Client und Server erfordert eine Verbindung. Die Socket-Programmierung ist für den Aufbau interaktiver Verbindungen zwischen Anwendungen verantwortlich.
Socket-Verbindungsprozess
Je nachdem, wie die Verbindung initiiert wird und mit welchem Ziel der lokale Socket verbunden ist, kann der Verbindungsprozess zwischen Sockets in drei Schritte unterteilt werden : Serverüberwachung, Clientanfrage, Verbindungsbestätigung.
(1) Serverüberwachung: Der serverseitige Socket findet den spezifischen Client-Socket nicht, sondern wartet auf eine Verbindung und überwacht den Netzwerkstatus in Echtzeit.
(2) Clientanforderung: Bezieht sich auf eine Verbindungsanforderung, die vom Socket des Clients gestellt wird, und das zu verbindende Ziel ist der Socket des Servers. Dazu muss der Socket des Clients zunächst den Socket des Servers beschreiben, mit dem er eine Verbindung herstellen möchte, die Adresse und Portnummer des serverseitigen Sockets angeben und dann eine Verbindungsanforderung an den serverseitigen Socket stellen.
(3) Verbindungsbestätigung: Bedeutet, dass der serverseitige Socket, wenn er die Verbindungsanforderung des Client-Sockets abhört oder empfängt, auf die Anforderung des Client-Sockets antwortet, einen neuen Thread erstellt und die Beschreibung sendet der serverseitige Socket zum Client. Sobald der Client diese Beschreibung bestätigt, wird die Verbindung hergestellt. Der serverseitige Socket befindet sich weiterhin im Überwachungsstatus und empfängt weiterhin Verbindungsanfragen von anderen Client-Sockets.
Das Socket-Prinzip kann sich auf das folgende Flussdiagramm beziehen:
Das Folgende ist eine einfache Implementierung der Socket-Kommunikation anhand eines Server-Client-Codebeispiels . Der gesamte Prozess
1. Sein Servercode:
<?php set_time_limit(0); //限制执行时间 0为不限制 $ip = '127.0.0.1'; $port = 8001;//端口 /** socket通信整个过程 socket_create //创建一个套接字 socket_bind //给套接字绑定 ip 和端口 socket_listen //监听套接字上的连接 socket_accept //接受一个socket连接 socket_read //接收客户端 发送的数据 socket_write //将数据写到 socket 缓存 向客户端发送 socket_close //关闭套接字资源 */ if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) { echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n"; } if(($ret = socket_bind($sock,$ip,$port)) < 0) { echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n"; } if(($ret = socket_listen($sock,4)) < 0) { echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n"; } $count = 0; do { if (($msgsock = socket_accept($sock)) < 0) { echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n"; break; } else { //发到客户端 $msg ="测试成功!\n"; socket_write($msgsock, $msg, strlen($msg)); echo "测试成功了啊\n"; $buf = socket_read($msgsock,8192); $talkback = "收到的信息:$buf\n"; echo $talkback; if(++$count >= 5){ break; }; } //echo $buf; socket_close($msgsock); } while (true); socket_close($sock); ?>
Führen Sie die PHP-Datei aus. Nach dem Ausführen sollte das Ergebnis für Sie nicht sichtbar sein kann netstat -ntlp verwenden. Überprüfen Sie, ob Port 8001 belegt ist. Siehe Bild unten.
2. Sein Client-Code:
<?php error_reporting(E_ALL); set_time_limit(0); echo "socket通信客户端\n"; $port = 8001;//端口 $ip = "127.0.0.1";//ip /** socket连接整个过程 socket_create //建立一个socket 连接 socket_connect // 开始一个socket连接 连接服务端 socket_write //将数据写入缓存 向服务端发送 socket_read// 读取服务端的结果 socket_close // 关闭套接字资源 */ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket < 0) { echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "OK.\n"; } echo "试图连接 '$ip' 端口 '$port'...\n"; $result = socket_connect($socket, $ip, $port); if ($result < 0) { echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n"; }else { echo "连接OK\n"; } $in = "Ho\r\nfirst blood\r\n"; $out = ''; if(!socket_write($socket, $in, strlen($in))) { echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n"; }else { echo "发送到服务器信息成功!\n"; echo "发送的内容为:<font color='red'>$in</font> <br>"; } while($out = socket_read($socket, 8192)) { echo "接收服务器回传信息成功!\n"; echo "接受的内容为:",$out; } echo "关闭SOCKET...\n"; socket_close($socket); echo "关闭OK\n"; ?>
Sehen Sie sich das Ergebnis des Serverfensters an:
Hinweis: Die Eigenschaften der PHP-Sprache bestimmen, dass PHP in dieser Hinsicht nur für den Client und nicht für den Server geeignet ist.
【Empfohlene verwandte Tutorials】
1. "php.cn Dugu Jiujian (4) - PHP-Video-Tutorial
2 Reihe von Tutorials zur PHP-Programmierung vom Einstieg bis zur BeherrschungDas obige ist der detaillierte Inhalt vonSo implementieren Sie eine einfache PHP-Socket-Kommunikation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!