Position actuelle: Accueil> Derniers articles> [Comment implémenter un mécanisme de communication bidirectionnel entre le client et le serveur via socket_export_stream?

[Comment implémenter un mécanisme de communication bidirectionnel entre le client et le serveur via socket_export_stream?

M66 2025-06-22

Dans la programmation réseau PHP, les fonctions Socket_ * de la série offrent aux développeurs les capacités de communication du réseau sous-jacentes. Bien que les fonctions Stream_Socket_ * de la série soient plus avancées et plus faciles à utiliser, Socket_ * présente toujours des avantages irremplaçables dans certains scénarios où les exigences de contrôle sous-jacentes sont plus élevées. Cet article présentera comment convertir la prise sous-jacente en flux via socket_export_stream , réalisant ainsi un mécanisme de communication bidirectionnel entre le client et le serveur.

Qu'est-ce que socket_export_stream?

Socket_export_stream est une fonction fournie par PHP pour exporter les ressources de socket sous-jacentes sous forme de ressources de flux, de sorte que des fonctions de flux de fichiers familières telles que Fread () et FWrite () peuvent être utilisées pour manipuler les données de socket. Cette approche combine la flexibilité de la prise sous-jacente avec la facilité d'utilisation de l'API du flux.

 stream socket_export_stream(Socket $socket): resource|false

Renvoie une ressource de flux de type qui peut être utilisée pour fonctionner en conjonction avec des fonctions telles que FOPEN , Stream_Select , Fgets , etc.


1. Créez une prise de serveur

Le serveur crée un socket TCP via socket_create () et le lie à une adresse et un port locaux.

 $serverSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($serverSocket, '0.0.0.0', 9501);
socket_listen($serverSocket);
echo "Le serveur est démarré,Écouter le port 9501...\n";

2. Acceptez la connexion et exportez-la comme flux

Le serveur bloque et attend les demandes de connexion du client et exporte les ressources de connexion en flux lisibles et écrivains.

 while (true) {
    $clientSocket = socket_accept($serverSocket);
    if ($clientSocket === false) {
        echo "Échec de l'acceptation de la connexion\n";
        continue;
    }

    $clientStream = socket_export_stream($clientSocket);
    if ($clientStream === false) {
        echo "Exporter stream échouer\n";
        socket_close($clientSocket);
        continue;
    }

    fwrite($clientStream, "Bienvenue m66.net Serveur\n");
    
    while (!feof($clientStream)) {
        $data = fgets($clientStream);
        if ($data === false) break;
        echo "Le client dit: $data";
        fwrite($clientStream, "Ce que vous avez dit est:$data");
    }

    fclose($clientStream);
    socket_close($clientSocket);
}

3. Connexion client au serveur

Le client utilise également socket_create pour se connecter au serveur, puis utilise socket_export_stream pour lire et écrire des données.

 $client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($client, 'm66.net', 9501);

$stream = socket_export_stream($client);
if ($stream === false) {
    echo "Exporter stream échouer\n";
    exit(1);
}

echo fgets($stream); // Recevoir un message de bienvenue

fwrite($stream, "Bonjour,serveur!\n");
echo fgets($stream); // Lire Echo

fclose($stream);
socket_close($client);

Avantages et précautions

Avantages

  • Le code est concis : l'interface de flux simplifie le processus de lecture et d'écriture des données de socket;

  • Compatibilité élevée : il peut être utilisé avec des fonctions telles que Stream_Select , Stream_Set_Blocking , etc.;

  • La communication bidirectionnelle est naturelle et fluide : la réponse en temps réel peut être obtenue grâce à la lecture et à l'écriture de boucle.

Choses à noter

  • socket_export_stream ne peut être utilisé que pour les prises connectées;

  • Après utilisation, vous devez fermer le flux et la prise pour éviter la fuite des ressources;

  • La communication du réseau doit considérer la gestion des exceptions et le contrôle du délai d'expiration pour éviter le blocage ou le plantage.