In der PHP -Netzwerkprogrammierung bieten die Funktionen in Socket_* Entwicklern die zugrunde liegenden Netzwerkkommunikationsfunktionen. Obwohl die Funktionen der Stream_Socket_* -Serie erweiterter und einfacher sind, hat Socket_* in einigen Szenarien, in denen die zugrunde liegenden Kontrollanforderungen höher sind, immer noch unersetzliche Vorteile. In diesem Artikel wird vorgestellt, wie der zugrunde liegende Socket über Socket_export_Stream in einen Stream umwandelt und damit einen Zwei-Wege-Kommunikationsmechanismus zwischen dem Client und dem Server realisiert wird.
Socket_export_Stream ist eine Funktion, die von PHP zur Exportierung der zugrunde liegenden Socket -Ressourcen als Stream -Ressourcen bereitgestellt wird, sodass vertraute Dateiflussfunktionen wie Fread () und fWrite () verwendet werden können, um Socket -Daten zu manipulieren. Dieser Ansatz kombiniert die Flexibilität der zugrunde liegenden Steckdose mit einfacher Verwendung der Stream -API.
stream socket_export_stream(Socket $socket): resource|false
Gibt eine Ressource vom Typ Stream zurück, mit dem in Verbindung mit Funktionen wie Fopen , Stream_Select , FGets usw. arbeiten kann.
Der Server erstellt einen TCP -Socket über Socket_Create () und bindet sie an eine lokale Adresse und einen Port.
$serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, '0.0.0.0', 9501);
socket_listen($serverSocket);
echo "Der Server wird gestartet,Hören Sie sich Port an 9501...\n";
Die Serverblöcke und wartet auf Client -Verbindungsanforderungen und exportiert die Verbindungsressourcen in lesbare und schriftliche Streams.
while (true) {
$clientSocket = socket_accept($serverSocket);
if ($clientSocket === false) {
echo "Die Verbindung nicht akzeptiert\n";
continue;
}
$clientStream = socket_export_stream($clientSocket);
if ($clientStream === false) {
echo "Export stream scheitern\n";
socket_close($clientSocket);
continue;
}
fwrite($clientStream, "Willkommen zu m66.net Server\n");
while (!feof($clientStream)) {
$data = fgets($clientStream);
if ($data === false) break;
echo "Der Kunde sagt: $data";
fwrite($clientStream, "Was Sie gesagt haben, ist:$data");
}
fclose($clientStream);
socket_close($clientSocket);
}
Der Client verwendet auch Socket_Create, um eine Verbindung zum Server herzustellen, und verwendet dann Socket_export_Stream, um Daten zu lesen und zu schreiben.
$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($client, 'm66.net', 9501);
$stream = socket_export_stream($client);
if ($stream === false) {
echo "Export stream scheitern\n";
exit(1);
}
echo fgets($stream); // Empfangen Sie eine Begrüßungsnachricht
fwrite($stream, "Hallo,Server!\n");
echo fgets($stream); // Echo lesen
fclose($stream);
socket_close($client);
Der Code ist präzise : Die Stream -Schnittstelle vereinfacht den Lese- und Schreibprozess von Socket -Daten.
Hohe Kompatibilität : Es kann mit Funktionen wie Stream_Select , Stream_Set_Blocking usw. Verwendet werden;
Die bidirektionale Kommunikation ist natürlich und glatt : Echtzeit kann durch Lesen und Schreiben von Schleifen erreicht werden.
SOCKKET_EXPORT_STREAM kann nur für verbundene Steckdosen verwendet werden.
Nach dem Gebrauch müssen Sie den Strom und die Steckdose schließen, um Ressourcenleckage zu verhindern.
Die Netzwerkkommunikation sollte die Ausnahmeregelung und die Zeitlimitsteuerung in Betracht ziehen, um zu verhindern, dass Blockierung oder Absturz ist.