Position actuelle: Accueil> Derniers articles> Implémentation du prototype d'application de salle de chat basée sur socket_accept ()

Implémentation du prototype d'application de salle de chat basée sur socket_accept ()

M66 2025-06-05

Dans la programmation Web, PHP est généralement utilisé pour gérer les demandes HTTP, mais en fait, PHP fournit également une riche fonctions de fonctionnement du réseau sous-jacente, y compris les fonctions Socket_ * , qui peuvent être utilisées pour implémenter les fonctions de communication TCP. Cet article montrera comment construire un prototype d'application de salle de discussion simple basé sur la fonction php socket_accept () pour vous aider à comprendre le mécanisme de programmation de socket de PHP.

1. Principes de base

Le mécanisme de base d'une salle de chat est: le serveur écoute un port, plusieurs clients se connectent au serveur via Socket, le serveur accepte la connexion du client (via socket_accept () ) et diffuse les messages reçus à tous les autres clients.

2. Code de serveur

Le serveur est responsable de la création de sockets, des ports de liaison, de l'écoute des connexions et de l'acceptation des connexions client dans une boucle, puis du traitement et du transfert des messages.

 <?php
$host = '0.0.0.0';
$port = 12345;
$clients = [];

$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, $host, $port);
socket_listen($server);

echo "Server started on $host:$port\n";

while (true) {
    $read = $clients;
    $read[] = $server;

    $write = $except = null;

    if (socket_select($read, $write, $except, null) < 1) {
        continue;
    }

    if (in_array($server, $read)) {
        $client = socket_accept($server);
        if ($client) {
            socket_getpeername($client, $addr, $port);
            echo "Client connected: {$addr}:{$port}\n";
            $clients[] = $client;
            socket_write($client, "Bienvenue dans la salle de chat!\n");
        }
        unset($read[array_search($server, $read)]);
    }

    foreach ($read as $sock) {
        $data = @socket_read($sock, 2048, PHP_NORMAL_READ);
        if ($data === false) {
            $index = array_search($sock, $clients);
            socket_getpeername($sock, $addr, $port);
            echo "Client disconnected: {$addr}:{$port}\n";
            unset($clients[$index]);
            socket_close($sock);
            continue;
        }

        $data = trim($data);
        if (!empty($data)) {
            socket_getpeername($sock, $addr, $port);
            $message = "[{$addr}:{$port}] expliquer: {$data}\n";

            foreach ($clients as $client) {
                if ($client !== $sock) {
                    socket_write($client, $message);
                }
            }

            echo $message;
        }
    }
}

3. Méthode de mise en œuvre du client

Les clients peuvent utiliser Telnet ou utiliser des navigateurs pour se connecter avec WebSocket Proxy. Cependant, si vous souhaitez utiliser PHP pour simuler un client pour envoyer des messages, vous pouvez également utiliser le code suivant:

 <?php
$host = '127.0.0.1';
$port = 12345;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);

echo socket_read($socket, 2048);

while (true) {
    echo "Veuillez saisir un message: ";
    $msg = trim(fgets(STDIN));

    if ($msg === 'exit') {
        break;
    }

    socket_write($socket, $msg . "\n");

    $response = socket_read($socket, 2048);
    echo "A reçu un message: " . $response;
}

socket_close($socket);

4. Suggestions pratiques et idées d'extension

  1. Prise en charge multi-processus : vous pouvez utiliser pcntl_fork () pour obtenir un support multi-processus pour éviter le blocage du processus principal.

  2. Gestion du journal : ajoutez un horodatage à chaque message pour faciliter le dépannage ultérieur.

  3. Identité : Définir un surnom ou ID pour chaque client peut améliorer l'expérience utilisateur.

  4. Connexion frontale : vous pouvez intégrer les salles de chat PHP avec la page Web front-end via le transfert WebSocket et utiliser Middleware similaire à http://m66.net/socket-proxy pour le pont de communication.

5. Résumé

Grâce à des fonctions de socket php telles que socket_accept () , nous pouvons implémenter un service de chat de base dans l'environnement de la ligne de commande. Bien que PHP ne soit pas le langage grand public pour la communication en temps réel, ses fonctions sous-jacentes peuvent toujours être utilisées pour remplir la fonction de communication TCP, ce qui convient comme un exemple d'introduction pour l'apprentissage des mécanismes de programmation du réseau. Si vous souhaitez le déployer dans un environnement de production, il est recommandé de combiner une file d'attente de messages plus professionnelle et un cadre de serveur asynchrone pour améliorer les performances et la stabilité.