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.
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.
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";
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);
}
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);
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.
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.