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.
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);
Der Parameter $ Socket ist ein Hörbuchse, das zuvor über Socket_Create () , Socket_Bind () und Socket_Listen () erstellt wurde.
Der Rückgabewert ist eine neue Socket -Ressource für die Interaktion mit dem Kunden.
Erstellen Sie einen TCP -Sockel.
Binden Sie IP und Port.
Hören Sie sich Client -Verbindungen an.
Verwenden Sie Socket_accept (), um Warten zu warten und Client -Verbindungen zu akzeptieren.
Vervollständigen Sie den WebSocket -Handschlag mit dem Client.
Die Datenkommunikation wird anschließend durchgeführt.
<?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);
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: