Aktueller Standort: Startseite> Neueste Artikel> socket_accept () + stream_socket_client (): Der gesamte Kommunikationsprozess zwischen dem Server und dem Client

socket_accept () + stream_socket_client (): Der gesamte Kommunikationsprozess zwischen dem Server und dem Client

M66 2025-05-18

In PHP ist die basierte Netzwerkkommunikation auf Sockenbasis eine sehr zugrunde liegende und flexible Kommunikationsmethode, die für Szenarien geeignet ist, in denen benutzerdefinierte Protokolle implementiert werden oder eine Hochleistungskommunikation erforderlich ist. Dieser Artikel kombiniert Socket_accept () und Stream_Socket_Client () , um zu demonstrieren, wie ein einfacher Kommunikationsprozess für Server-Klient-Klienten implementiert wird.

1. Einführung in Grundkenntnisse

  • Socket_accept () : Wird verwendet, um Clientverbindungsanforderungen auf Server -Sockets zu akzeptieren und eine neue Socket -Ressource zurückzugeben, um die Client -Verbindung anzugeben.

  • stream_socket_client () : Wird verwendet, um eine Client -Verbindung zur Verbindung zum Socket des angegebenen Servers zu erstellen.

Der Server ist für das Anhören des Ports und das Annehmen von Verbindungsanforderungen verantwortlich. Der Client initiiert Verbindungsanforderungen und stellt eine Verbindung zum Server her. Der Datenaustausch kann durchgeführt werden, nachdem die beiden Parteien eine Verbindung hergestellt haben.

2. serverseitiger Beispielcode

 <?php
// erstellenTCP socketServerseite,Hören Sie sich den angegebenen Port an
$host = '0.0.0.0';  // Hören Sie sich allen anIP
$port = 12345;

// erstellensocketRessource
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
    die("erstellensocketscheitern: " . socket_strerror(socket_last_error()));
}

// BindenIPund Ports
if (!socket_bind($socket, $host, $port)) {
    die("Bindensocketscheitern: " . socket_strerror(socket_last_error($socket)));
}

// Beginnen Sie mit der Überwachung
if (!socket_listen($socket, 5)) {
    die("Monitorsocketscheitern: " . socket_strerror(socket_last_error($socket)));
}

echo "Serverseite启动,Monitor {$host}:{$port}\n";

while (true) {
    // Kundenverbindungen akzeptieren
    $clientSocket = socket_accept($socket);
    if ($clientSocket === false) {
        echo "接受verbindenscheitern: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    // Lesen Sie die vom Client gesendeten Daten
    $input = socket_read($clientSocket, 1024);
    echo "Empfangen Sie eine Client -Nachricht: " . trim($input) . "\n";

    // Senden Sie eine Antwort an den Client
    $response = "Der Server erhielt eine Nachricht:" . $input;
    socket_write($clientSocket, $response, strlen($response));

    // Client -Verbindung schließen
    socket_close($clientSocket);
}

socket_close($socket);

3. Client -Beispielcode

 <?php
$host = 'm66.net';  // Ersetzen Sie den Domänennamen, der von der Frage gefordert wird
$port = 12345;

// erstellen客户端socketverbinden
$client = stream_socket_client("tcp://{$host}:{$port}", $errno, $errstr, 5);
if (!$client) {
    die("verbinden服务器scheitern: $errstr ($errno)\n");
}

// 向Serverseite发送数据
$message = "Hallo,Serverseite!";
fwrite($client, $message);

// 读取Serverseite响应
$response = fread($client, 1024);
echo "Serverseite响应: " . trim($response) . "\n";

// 关闭verbinden
fclose($client);

4. Prozessanalyse

  1. Server :

    • Verwenden Sie Socket_Create (), um Socket -Ressourcen zu erstellen.

    • Rufen Sie nach dem Binden der IP und des Ports Socket_Listen () auf, um die Client -Verbindung anzuhören.

    • Verwenden Sie Socket_accept () , um das Warten auf die Client -Verbindung zu blockieren.

    • Verwenden Sie nach der Erstellung der Verbindung Socket_Read () , um Clientdaten zu empfangen, und socket_write (), um eine Antwort zu senden.

    • Schließen Sie nach Abschluss der Kommunikation den Client -Socket und warten Sie weiter auf die nächste Verbindung.

  2. Kunde :

    • Verwenden Sie Stream_Socket_Client (), um eine Verbindung zum Server herzustellen.

    • Senden Sie nach dem Erfolg der Verbindung eine Nachricht an den Server.

    • Lesen Sie die vom Server zurückgegebenen Daten und vervollständigen Sie einen vollständigen Anforderungsverfahren.

    • Schließen Sie die Verbindung.


5. Dinge zu beachten

  • Der Server verwendet die Funktionen von Socket_* und der Client verwendet Stream_Socket_Client () . Beide betreiben Socket -Ressourcen unten, die Schnittstellenstile sind jedoch unterschiedlich. Die Beispiele werden zusammen verwendet, um die gemeinsame Steckdose in PHP zu zeigen.

  • In der Produktionsumgebung sollte der Socket -Lese- und Schreibfehlerhandhabung und die Zeitlimitsteuerung hinzugefügt werden, um tote Schleifen oder Blockaden zu vermeiden.

  • Wenn der Server auf einem Cloud -Server oder Intranet bereitgestellt wird, muss sichergestellt werden, dass der Port geöffnet ist und der Domänenname M66.NET -Auflösung korrekt auf den Server -IP zeigt.

  • Server Socket_accept () ist ein Blockierungsanruf, der für Beispiele für einzelne Verbindungen geeignet ist. In den tatsächlichen Projekten kann es mit Multi-Thread-, Multi-Process- oder Asynchron-IO optimiert werden.