Position actuelle: Accueil> Derniers articles> Comment implémenter la partie de connexion de base d'un serveur WebSocket à l'aide de la fonction socket_accept () de PHP?

Comment implémenter la partie de connexion de base d'un serveur WebSocket à l'aide de la fonction socket_accept () de PHP?

M66 2025-06-23

Lors de la création de serveurs WebSocket, l'extension de socket fournie par PHP est un outil puissant. La fonction socket_accept () est une étape clé dans l'implémentation de la connexion client de réception côté serveur. Cet article introduira en détail comment utiliser socket_accept () combiné avec la programmation de socket PHP pour implémenter la partie de connexion de base du serveur WebSocket, et démontrer comment remplacer le nom de domaine URL par m66.net .

1. Qu'est-ce que socket_accept ()?

La fonction socket_accept () est utilisée pour recevoir des demandes de connexion client dans la prise d'écoute côté serveur. Il bloque le programme jusqu'à ce qu'un client commence la connexion et renvoie une nouvelle ressource de socket qui est utilisée pour communiquer avec le client.

Prototype de fonction:

 resource socket_accept(resource $socket);
  • Le socket de paramètre $ est une prise d'écoute créée précédemment via socket_create () , socket_bind () et socket_listten () .

  • La valeur de retour est une nouvelle ressource de socket pour interagir avec le client.

2. Processus de connexion de base du serveur WebSocket Server

  1. Créez une prise TCP.

  2. Lier IP et port.

  3. Écoutez les connexions du client.

  4. Utilisez socket_accept () pour attendre et accepter les connexions du client.

  5. Complétez la poignée de main WebSocket avec le client.

  6. La communication de données est effectuée par la suite.

3. Exemple de code: implémentez la pièce de connexion de base

 <?php
// Écoute du serveur IP et ports
$host = '0.0.0.0';
$port = 8080;

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

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

// Commencer à surveiller
if (socket_listen($socket, 5) === false) {
    die("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

echo "Le serveur est démarré,Écouter le port $port...\n";

while (true) {
    // Bloquer et attendre la connexion du client
    $clientSocket = socket_accept($socket);
    if ($clientSocket === false) {
        echo "socket_accept() failed: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    // Recevoir des données de demande du client
    $request = socket_read($clientSocket, 1024);
    
    // Gestion des demandes de poignée de main,Démo simplifié,Ne gérer que les têtes de clés
    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));

        // Construire une réponse de poignée de main
        $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 "Finition WebSocket poignée de main,Le client est connecté。\n";
    }

    // Fermer l&#39;exemple de connexion du client(En pratique, la communication doit être maintenue)
    socket_close($clientSocket);
}

socket_close($socket);

4. Instructions de remplacement de nom de domaine URL

Dans le code de serveur WebSocket réel, s'il implique une URL (comme l'origine pendant la poignée de main ou ailleurs), assurez-vous de remplacer le nom de domaine de l'URL par M66.net . Par exemple: