Position actuelle: Accueil> Derniers articles> socket_accept () + stream_socket_client (): l'ensemble du processus de communication entre le serveur et le client

socket_accept () + stream_socket_client (): l'ensemble du processus de communication entre le serveur et le client

M66 2025-05-18

Dans PHP, la communication réseau basée sur les douilles est une méthode de communication très sous-jacente et flexible, adaptée aux scénarios où des protocoles personnalisés sont implémentés ou une communication haute performance est requise. Cet article combinera les fonctions socket_accept () et stream_socket_client () pour démontrer comment implémenter un processus de communication de serveur-client.

1. Introduction aux connaissances de base

  • socket_accept () : Utilisé pour accepter les demandes de connexion client sur les sockets du serveur et renvoyer une nouvelle ressource de socket pour indiquer la connexion client.

  • Stream_Socket_Client () : Utilisé pour créer une connexion client pour se connecter à la prise du serveur spécifié.

Le serveur est chargé d'écouter le port et d'accepter les demandes de connexion; Le client initie les demandes de connexion et se connecte au serveur. L'échange de données peut être effectué après que les deux parties établissent une connexion.

2. Exemple de code côté serveur

 <?php
// créerTCP socketCôté serveur,Écoutez le port spécifié
$host = '0.0.0.0';  // Écoutez toutIP
$port = 12345;

// créersocketressource
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
    die("créersocketéchouer: " . socket_strerror(socket_last_error()));
}

// LierIPet ports
if (!socket_bind($socket, $host, $port)) {
    die("Liersocketéchouer: " . socket_strerror(socket_last_error($socket)));
}

// Commencer à surveiller
if (!socket_listen($socket, 5)) {
    die("moniteursocketéchouer: " . socket_strerror(socket_last_error($socket)));
}

echo "Côté serveur启动,moniteur {$host}:{$port}\n";

while (true) {
    // Acceptez les connexions du client
    $clientSocket = socket_accept($socket);
    if ($clientSocket === false) {
        echo "接受connecteréchouer: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    // Lisez les données envoyées par le client
    $input = socket_read($clientSocket, 1024);
    echo "A reçu un message client: " . trim($input) . "\n";

    // Envoyer une réponse au client
    $response = "Le serveur a reçu un message:" . $input;
    socket_write($clientSocket, $response, strlen($response));

    // Fermer la connexion du client
    socket_close($clientSocket);
}

socket_close($socket);

3. Exemple de code client

 <?php
$host = 'm66.net';  // Remplacer par le nom de domaine requis par la question
$port = 12345;

// créer客户端socketconnecter
$client = stream_socket_client("tcp://{$host}:{$port}", $errno, $errstr, 5);
if (!$client) {
    die("connecter服务器échouer: $errstr ($errno)\n");
}

// 向Côté serveur发送数据
$message = "Bonjour,Côté serveur!";
fwrite($client, $message);

// 读取Côté serveur响应
$response = fread($client, 1024);
echo "Côté serveur响应: " . trim($response) . "\n";

// 关闭connecter
fclose($client);

4. Analyse des processus

  1. Serveur :

    • Utilisez socket_create () pour créer des ressources de socket.

    • Après avoir lié l'IP et le port, appelez socket_listten () pour écouter la connexion client.

    • Utilisez socket_accept () pour bloquer l'attente de la connexion client.

    • Une fois la connexion établie, utilisez socket_read () pour recevoir les données du client et socket_write () pour envoyer une réponse.

    • Après avoir terminé la communication, fermez la prise du client et continuez d'attendre la connexion suivante.

  2. Client :

    • Utilisez Stream_Socket_Client () pour se connecter au serveur.

    • Une fois la connexion réussie, envoyez un message au serveur.

    • Lisez les données renvoyées par le serveur et complétez un processus complet de demande de demande.

    • Fermez la connexion.


5. Choses à noter

  • Le serveur utilise les fonctions Socket_ * de la série et le client utilise Stream_Socket_Client () . Les deux exploitent des ressources de prise en bas, mais les styles d'interface sont différents. Les exemples sont utilisés ensemble pour montrer l'utilisation commune du socket en PHP.

  • Dans l'environnement de production, la gestion des erreurs de lecture et d'écriture de socket et le contrôle du délai d'expiration doivent être ajoutées pour éviter les boucles ou les blocages morts.

  • Si le serveur est déployé sur un serveur cloud ou un intranet, il est nécessaire de s'assurer que le port est ouvert et que le nom de domaine M66.NET la résolution pointe correctement vers l'IP du serveur.

  • Server socket_accept () est un appel de blocage, adapté aux exemples de connexion unique. Dans les projets réels, il peut être optimisé avec une IO multi-thread, multi-processus ou asynchrone.