Aktueller Standort: Startseite> Neueste Artikel> So implementieren Sie den grundlegenden Verbindungsteil eines WebSocket -Servers mithilfe von PHPs Socket_accept () -Funktion?

So implementieren Sie den grundlegenden Verbindungsteil eines WebSocket -Servers mithilfe von PHPs Socket_accept () -Funktion?

M66 2025-06-23

Beim Erstellen von WebSocket -Servern ist die von PHP bereitgestellte Socket -Erweiterung ein leistungsstarkes Tool. Die Funktion von Socket_accept () ist ein Schlüsselschritt bei der Implementierung der serverseitigen Empfangs-Clientverbindung. In diesem Artikel wird detailliert eingeführt, wie Sie Socket_accept () in Kombination mit PHP -Socket -Programmierung verwenden, um den grundlegenden Verbindungsteil des WebSocket -Servers zu implementieren und zu demonstrieren, wie der URL -Domänenname durch m66.net ersetzt wird.

1. Was ist Socket_accept ()?

Mit der Funktion von Socket_accept () werden Client-Verbindungsanforderungen in der serverseitigen Hörbuchse empfangen. Es blockiert das Programm, bis ein Kunde die Verbindung initiiert und eine neue Socket -Ressource zurückgibt, die zur Kommunikation mit dem Kunden verwendet wird.

Funktionsprototyp:

 resource socket_accept(resource $socket);

2. WebSocket Server grundlegender Verbindungsprozess

  1. Erstellen Sie einen TCP -Sockel.

  2. Binden Sie IP und Port.

  3. Hören Sie sich Client -Verbindungen an.

  4. Verwenden Sie Socket_accept (), um Warten zu warten und Client -Verbindungen zu akzeptieren.

  5. Vervollständigen Sie den WebSocket -Handschlag mit dem Client.

  6. Die Datenkommunikation wird anschließend durchgeführt.

3. Beispielcode: Implementieren Sie den grundlegenden Verbindungsteil

 <?php
// Serverzuhören IP und Ports
$host = '0.0.0.0';
$port = 8080;

// erstellen TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n");
}

// Binden IP und Ports
if (socket_bind($socket, $host, $port) === false) {
    die("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// Beginnen Sie mit der Überwachung
if (socket_listen($socket, 5) === false) {
    die("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

echo "Der Server wird gestartet,Hören Sie sich Port an $port...\n";

while (true) {
    // Blockieren und Warten auf die Kundenverbindung
    $clientSocket = socket_accept($socket);
    if ($clientSocket === false) {
        echo "socket_accept() failed: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    // Empfangen Sie Kundenanforderungsdaten
    $request = socket_read($clientSocket, 1024);
    
    // Handshake -Anfragen umgehen,Vereinfachte Demo,Nur die Schlüsselköpfe verarbeiten
    if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $request, $matches)) {
        $key = trim($matches[1]);
        $acceptKey = base64_encode(sha1($key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));

        // Erstellung einer Handshake -Reaktion
        $headers = "HTTP/1.1 101 Switching Protocols\r\n";
        $headers .= "Upgrade: websocket\r\n";
        $headers .= "Connection: Upgrade\r\n";
        $headers .= "Sec-WebSocket-Accept: $acceptKey\r\n";
        $headers .= "\r\n";

        socket_write($clientSocket, $headers);
        echo "Beenden WebSocket Handschlag,Der Client ist verbunden。\n";
    }

    // Beispiel für Clientverbindungen schließen(In der Praxis sollte die Kommunikation aufrechterhalten werden)
    socket_close($clientSocket);
}

socket_close($socket);

4..

Wenn Sie im tatsächlichen WebSocket -Servercode eine URL (z. B. Ursprung während des Handschlags oder an anderer Stelle) umfassen, stellen Sie sicher, dass der Domänenname in der URL durch m66.net ersetzt wird. Zum Beispiel: