Aktueller Standort: Startseite> Neueste Artikel> [So implementieren Sie einen Zwei-Wege-Kommunikationsmechanismus zwischen dem Client und dem Server über socket_export_stream?

[So implementieren Sie einen Zwei-Wege-Kommunikationsmechanismus zwischen dem Client und dem Server über socket_export_stream?

M66 2025-06-22

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.

Was ist socket_export_stream?

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.


1. Erstellen Sie einen Server -Socket

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";

2. Akzeptieren Sie die Verbindung und exportieren Sie sie als Stream

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);
}

3. Clientverbindung zum Server

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);

Vorteile und Vorsichtsmaßnahmen

Vorteile

  • 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.

Dinge zu beachten

  • 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.