Maison  >  Article  >  php教程  >  Explication détaillée des exemples de mécanismes de communication de socket en php

Explication détaillée des exemples de mécanismes de communication de socket en php

高洛峰
高洛峰original
2016-12-22 09:51:151084parcourir

Les exemples de cet article décrivent le mécanisme de communication des sockets et leur utilisation en php. Partagez-le avec tout le monde pour votre référence. L'analyse spécifique est la suivante :

1. Qu'est-ce qu'une socket ?

Qu'est-ce qu'une socket ? Adresse IP et port. C'est le handle d'une chaîne de communication. Les applications envoient généralement des requêtes au réseau ou répondent aux requêtes du réseau via des « sockets ». Pour parler franchement, il s’agit d’un mécanisme de communication. Il est similaire aux services de service client téléphonique des banques, des télécommunications et d'autres services. Lorsque vous appelez, une personne sera désignée pour répondre à vos questions. Le service client est équivalent au côté serveur du socket, et votre côté est équivalent au client avant la fin de l'appel avec vous, si quelqu'un est dessus. impossible de parler à votre interlocuteur car vous communiquez avec lui. Bien entendu, le standard téléphonique du service client ne sera pas dupliqué.

Ci-dessous, je vais donner un exemple pour expliquer le fonctionnement du socket. Si vous développez à partir de la couche applicative, vous n’avez pas forcément besoin d’en comprendre le principe, mais il vaut mieux le savoir. Il existe des API PHP sur les sockets sur Internet. Posez-le et utilisez-le.

2. socket server server.php

<?php  
// 建立server端socket  
$tcp = getprotobyname("tcp");  
$socket = socket_create(af_inet, sock_stream, $tcp);  
socket_bind($socket, &#39;127.0.0.1&#39;, 10008);       //绑定要监听的端口  
socket_listen($socket);       //监听端口 
 
//初始化一个数据,和客户端通信  
$buffer = "connect";  
while (true) {  
    // 接受一个socket连接  
    $connection = socket_accept($socket);  
    if(!$connection){  
        echo "connect fail";  
    }else{  
            echo  "socket connected ";  
            // 向客户端传递一个信息数据  
            if ($buffer != "") {  
                echo "send data to client ";  
                socket_write($connection, $buffer . " ");  
                echo  "wrote to socket ";  
            } else {  
                echo  "no data in the buffer " ;  
            }  
            // 从客户端取得信息  
            while ($data = @socket_read($connection, 1024, php_normal_read)) {  
                    printf("buffer: " . $data . " ");  
                    //取得信息给客户端一个反馈  
                    socket_write($connection, "information received ");  
            }
    } 
 
    socket_close($connection);  
    //关闭 socket  
    printf("closed the socket ");  
}  
?>

3. socket client client.php

<?php  
// 建立客户端的socet连接  
$socket = socket_create(af_inet, sock_stream, sol_tcp);  
$connection = socket_connect($socket, &#39;127.0.0.1&#39;, 10008);    //连接服务器端socket 
 
while ($buffer = @socket_read($socket, 1024, php_normal_read)) {  
    //服务端告诉客户端,自己的状态  
    if (preg_match("/not connect/",$buffer)) {  
        echo "don`t connect ";  
        break;  
    } else {  
        //服务器传来信息  
        echo "buffer data: " . $buffer . " "; 
 
        echo "writing to socket ";  
        // 将客户的信息写到通道中,传给服务器端  
        if (!socket_write($socket, "some data ")) {  
            echo "write failed ";  
        }  
        //服务器端收到信息后,给于的回应信息  
        while ($buffer = socket_read($socket, 1024, php_normal_read)) {  
                echo "sent to server: some data response from server was:" . $buffer . " ";  
        } 
 
    }  
} 
?>

4. considéré Fermer automatiquement le socket à la fin du temps)

Une brève explication. Avant d'expliquer, je veux dire pourquoi vous devez utiliser la commande php pour exécuter le serveur et le client. vous utilisez fsockopen, vous pouvez donc parcourir. En cas d'accès sur le serveur, la connexion expirera. Pourquoi ? Parce que lorsque vous créez un socket, il surveillera en permanence si le client souhaite se connecter.

L'établissement de la communication socket nécessite deux canaux socket, un créé par le serveur et un créé par le client.

Ligne 1, le serveur crée un canal socket, met les informations dans le cache et attend que le client se connecte

Ligne 2, le client crée un canal socket et se connecte au serveur pour obtenir Le serveur communique avec les informations et envoie les informations au canal

ligne 3. Le serveur obtient les informations du client et informe le client que j'ai reçu les informations. Envoyez les informations à transmettre dans le canal

ligne 4, et le client obtient les informations de confirmation du serveur

À ce stade, la communication est complètement établie une fois la transmission des données terminée. , le serveur sera déconnecté de la communication Socket, l'opération spécifique est la suivante.

1 Exécutez le serveur socket

[root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/server.php 
interactive mode enabled

Quel type de travail a été effectué à ce stade

a Écouter un port 10008

[zhangy@blackghost ~]$ netstat -an |grep listen |grep 10008
tcp        0      0 127.0.0.1:10008    0.0.0.0:*      listen
[zhangy@blackghost ~]$

b Envoyer les informations au cache

$buffer = "connect";

Regardez le code ci-dessus

2 Exécutez le client socket

[root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/client.php 
interactive mode enabled 
 
buffer data: connect 
 
writing to socket 
sent to server: some data 
response from server was:information received

3 Retour au serveur

[root@blackghost zhangy]# /usr/local/php/bin/php -a /home/zhangy/www/test2/server.php 
interactive mode enabled 
 
socket connected 
send data to client 
wrote to socket 
buffer: some data 
 
closed the socket

J'espère que cet article sera utile à la programmation PHP de chacun.

Pour des explications plus détaillées sur les exemples de mécanismes de communication de socket en PHP et les articles associés, veuillez faire attention au site Web PHP chinois !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn