Maison  >  Article  >  développement back-end  >  PHP peut-il implémenter la communication socket ?

PHP peut-il implémenter la communication socket ?

藏色散人
藏色散人original
2023-02-09 10:09:053520parcourir

php peut implémenter la communication par socket. La méthode d'implémentation est la suivante : 1. Créez "socketsocket_create();" sur le client et demandez une connexion au serveur "socket_connect();" 2. Créez "socketsocket_create();" serveur et liaison Définissez l'IP et le numéro de port "socket_bind();"; 3. Lisez les messages du client ou écrivez des messages au client via "socket_wirte();socket_read".

PHP peut-il implémenter la communication socket ?

L'environnement d'exploitation de ce tutoriel : système Windows 10, PHP version 8.1, ordinateur DELL G3

php peut-il réaliser une communication socket ?

socket PHP : implémentation PHP détaillée et simple de la communication socket TCP

1 Introduction au contexte

Objectif : J'espère construire un serveur via la transmission socket TCP La fonction de ce serveur est d'accepter plusieurs connexions client et. compléter leur communication mutuelle. Par exemple, le client A et le client B sont connectés au serveur S en même temps. Le client A envoie un message au serveur S. Le serveur S transmettra le message de A à B. De même, le message de B peut également être transmis à A via S. De cette façon, une communication mutuelle entre le client A et le client B est réalisée. Cette fois, nous implémentons uniquement la connexion et la communication entre le client et le serveur, et n'avons pas la fonction de transfert du serveur pour le moment.

2 Une brève introduction à TCP

2.1 La « poignée de main à trois voies » de TCP

La poignée de main à trois voies de TCP peut assurer une communication normale entre le serveur et le client. Processus de négociation à trois : Quant à l'explication de ce processus, vous pouvez cliquer sur le lien ci-dessous pour le visualiser.


PHP peut-il implémenter la communication socket ? Référence : https://www.php.cn/link/70203474234c15a59de1eacc053f5690

2.2 IP et PORT

Le serveur doit avoir une IP et un numéro de port pour la communication TCP.

Le service client doit avoir une adresse IP et lors de la communication avec TCP, il doit également fournir un numéro de port.

Compréhension personnelle : IP est une adresse, qui peut être comprise comme une maison. Lorsque vous devez établir une communication, vous devez d'abord savoir où se trouve la maison. Sinon, où devons-nous envoyer l'information ?

Port PORT, le numéro de port peut être compris comme une porte dans cette maison. Nous devons spécifier une porte pour envoyer des messages ou recevoir des messages depuis cette porte.

2.2 Bref processus de communication entre le client et le serveur

2.2.1 Quelques fonctions liées de php
client:

    Create socket
  1. socket_create ();
  2. request une connexion à partir du serveur
  3. socket_connect ( ) ;
  4. Envoyer des messages vers/accepter les messages du serveur
  5. socket_wirte(); / socket_read();
  6. Fermer le socket
  7. socket_close();
Serveur :

  • Créer un socket

    socket_create();

  • Lier l'IP et le numéro de port

    socket_bind();

  • Écouter l'IP et le numéro de port (0.0.0.0 signifie n'importe quelle IP)

    socket_listen();

  • Bloquer en attente de connexion client

    socket_accept ();

  • Lire les messages des clients/écrire des messages aux clients

    socket_wirte(); / socket_read();

  • Fermer le socket

    socket_close();

2.2. processus
    Le serveur crée un socket, lie IP et PORT, puis entre dans l'état d'écoute pour attendre que le client initie une connexion.
  • Le client crée un socket et se connecte à l'IP et au PORT du serveur spécifiés.

  • Le serveur accepte la connexion initiée par le client.

  • Les deux parties peuvent s'envoyer des données

  • Les deux parties ferment la prise.

AB Créer une socket Créez un socket, configuré pour autoriser l'accès à l'IP et au PORTécoutez une certaine (ou la totalité) de l'IP et un certain port, et entrez le blocage en attendant le clientinitiez la connexion vers l'IP/PORT du serveur spécifié Accepter la connexion du client ALes deux parties ont établi une connexionEnvoyer un message Communication Après avoir terminé, A et B ferment la prise en même tempsAB

Il s'agit d'un bref processus de communication. Quant à l'envoi cyclique ou à la détection d'anomalies, il s'agit de quelques détails.

3 Commencez à pratiquer

3.1 Installation PHP et configuration de l'environnement

  1. Installez PHP. Ici, j'ai installé XAMPP directement, et ce logiciel a installé PHP tout seul. Si c'est la première fois que vous utilisez le langage PHP, vous pouvez installer PHP directement depuis Baidu, ou vous pouvez installer XAMPP.
  2. Configuration de l'environnement système. Lors de l'exécution du programme, je l'exécute via cmd, je dois donc configurer les variables d'environnement système. Pour le processus de configuration, veuillez vous référer à : Lien : Configuration des variables d'environnement PHP.
  3. Vérifiez si la commande php peut s'exécuter. Après avoir terminé les étapes 1 et 2, exécutez cmd et exécutez la commande php -v Une fois l'opération terminée, le numéro de version de PHP s'affichera. Insérer la description de l'image iciphp -v ,运行完成之后会显示PHP的版本号。PHP peut-il implémenter la communication socket ?

3.2 客户端程序

3.2.1 写程序
  1. 新建一个文件夹socket,在该文件夹下新建文本文档并改名为client.php NOTE:我的文件夹建在桌面上
  2. 打开client.php NOTE:如果你平时没有php的编辑器,这个时候可以直接用记事本打开client.php
  3. 写入程序 NOTE:程序我这里直接给出,并给予注释,大家可以结合2.2通信过程进行理解,如有疑问请留言
<?php
$PORT = 请输入端口号; //端口号请查看博文:*3.2.2 程序执行*。设置有效端口:
$client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数1:代表IPV4/参数2:流传输/参数3:TCP/
$result = socket_connect($client, "122.114.122.174", $PORT); //向指定地址/端口发出连接请求,连接结果返回到resule
if($result == false){  //这里我们简单的对连接结果进行响应/为了Debug方便
    echo "ERROR CONNECT\n"; 
    die();
} else {
    echo "CONNECTED\n";
}
$data = "Hello World\n"; //建立将要发送的消息
socket_write($client, $data); //将消息发送出去
socket_close($client); //关闭socket
?>
  1. 程序编写完毕,大家可以直接复制过去,或者直接下载NOTE:程序直接运行会报错,我们需要指定一个端口号,请继续看下节,如何运行程序。
3.2.2 程序执行
  1. 获取程序。通过上节,我们已经有一个简单的客服端程序,下载请点击
  2. 查找有效端口。因为我们现在没有服务器,所以需要借助别人提供的服务器地址及端口进行调试。
    操作步骤:
    1.点击这里打开网页
    2.页面的下方找到:122.114.122.174:xxxxx
    3.将xxxxx部分替换到程序中的第二行并保存
    网页操作:
    PHP peut-il implémenter la communication socket ?
    程序操作:
    PHP peut-il implémenter la communication socket ?
  3. 打开cmd。如果没有配置PHP的环境变量请查看:3.1 PHP安装及环境配置
  4. 执行命令cd desktop/socket。目的是为了到socket文件夹,根据自己文件夹位置填写相关路径。
  5. 执行客户端程序php client.php
    3.2 Programme clientPHP peut-il implémenter la communication socket ?

    3.2.1 Programme d'écriture

    Créez un nouveau dossiersocket, créez un nouveau document texte sous le dossier et renommez-le Ouvrir client.php
  6. pour
client.php

REMARQUE : Mon dossier est créé sur le bureau

REMARQUE : Si vous n'avez pas d'éditeur php, vous pouvez ouvrir directement client.php avec le bloc-notes à ce moment

writeprogram REMARQUE : je vais donner le programme directement ici et faire des commentaires. Vous pouvez le comprendre sur la base du processus de communication 2.2. Si vous avez des questions, veuillez laisser un message

🎜🎜
<?php
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数解释同客服端
socket_bind($server, "0.0.0.0", 12345); //绑定端口和IP/0.0.0.0表示允许任意地址发起连接/12345表示允许12345端口号进行连接
socket_listen($server); //进入监听
$connection = socket_accept($server); //接受请求并建立连接
$data = socket_read($connection, 1024); //接受数据
echo $data; //打印数据
socket_close($server);//关闭socket
?>
    🎜Le le programme est écrit et vous pouvez le copier directement, ou le 🎜télécharger directement🎜. REMARQUE : Une erreur sera signalée si le programme est exécuté directement. Nous devons spécifier un numéro de port. Veuillez passer à la section suivante sur la façon d'exécuter le programme. . 🎜🎜🎜
    🎜3.2.2 Exécution du programme
    🎜🎜🎜Obtenir le programme🎜. Dans la section précédente, nous avons déjà un programme client simple, 🎜Veuillez cliquer sur 🎜 pour télécharger. 🎜🎜🎜Trouver des ports valides🎜. Parce que nous n'avons pas de serveur pour le moment, nous devons utiliser l'adresse du serveur et le port fournis par d'autres pour le débogage. 🎜Étapes de fonctionnement :🎜 1.Cliquez ici pour ouvrir la page Web🎜🎜 2. Recherchez en bas de la page page : 122.114.122.174 :🎜xxxxx🎜🎜 3. Remplacez la partie xxxxx par la deuxième ligne du programme et enregistrez 🎜 Opération de page Web : 🎜PHP peut-il implémenter la communication socket ?🎜 Fonctionnement du programme : 🎜PHP peut-il implémenter la communication socket ?🎜🎜🎜Ouvrez cmd🎜. Si les variables d'environnement PHP ne sont pas configurées, veuillez vérifier : 🎜3.1 Installation PHP et configuration de l'environnement 🎜🎜🎜🎜Exécutez la commande 🎜cd desktop/socket. Le but est d'aller dans le dossier socket et de renseigner le chemin correspondant en fonction de l'emplacement de votre propre dossier. 🎜🎜🎜Exécutez le programme client🎜php client.php. Si une erreur PHP Fatal est signalée à ce moment-là, veuillez vérifier 🎜Cliquez pour voir la solution🎜🎜🎜🎜 Enfin, nous pouvons voir que l'information a été reçue dans la page Web. 🎜 REMARQUE : Après avoir exécuté le programme, si CONNECTED n'est pas imprimé, attendez un moment et constatez que ERROR CONNET est renvoyé. En effet, notre 🎜numéro de port a expiré (ne peut être utilisé que pendant 3 minutes), retournez simplement à la page Web pour l'actualiser et le modifier dans le programme🎜. 🎜S'il ne peut pas fonctionner correctement, veuillez laisser un message🎜 !🎜🎜🎜🎜🎜3.3 Serveur local et programme client🎜🎜🎜Si vous ne souhaitez pas le saisir vous-même, veuillez 🎜cliquez ici pour télécharger🎜 et passez à : 3.3 .3 Exécution du programme. 🎜🎜
    3.3.1 写程序/服务器
    1. 新建一个文件夹socket(如有,请忽略),在该文件夹下新建文本文档并改名为server.php NOTE:我的文件夹建在桌面上
    2. 打开server.php NOTE:如果你平时没有php的编辑器,这个时候可以直接用记事本打开server.php
    3. 写入程序 NOTE:程序我这里直接给出,并给予注释,大家可以结合2.2通信过程进行理解,如有疑问请留言
    <?php
    $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数解释同客服端
    socket_bind($server, "0.0.0.0", 12345); //绑定端口和IP/0.0.0.0表示允许任意地址发起连接/12345表示允许12345端口号进行连接
    socket_listen($server); //进入监听
    $connection = socket_accept($server); //接受请求并建立连接
    $data = socket_read($connection, 1024); //接受数据
    echo $data; //打印数据
    socket_close($server);//关闭socket
    ?>
    3.3.2 写程序/客户端
    1. 打开文件夹socket(server.php所在文件夹),在该文件夹下新建文本文档并改名为client.php(如有,请打开直接修改程序即可) NOTE:我的文件夹建在桌面上
    2. 打开client.php NOTE:如果你平时没有php的编辑器,这个时候可以直接用记事本打开client.php
    3. 写入程序 NOTE:程序我这里直接给出,并给予注释,大家可以结合2.2通信过程进行理解,如有疑问请留言
    <?php
    $PORT = 12345; //与server端口匹配
    $client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建socket/参数1:代表IPV4/参数2:流传输/参数3:TCP/
    $result = socket_connect($client, "127.0.0.1", $PORT); //向指定地址/端口发出连接请求,连接结果返回到resule/127.0.0.1指本地IP
    if($result == false){  //这里我们简单的对连接结果进行响应/为了Debug方便
        echo "ERROR CONNECT\n"; 
        die();
    } else {
        echo "CONNECTED\n";
    }
    $data = "Hello World\n"; //建立将要发送的消息
    socket_write($client, $data); //将消息发送出去
    socket_close($client); //关闭socket
    ?>
    3.3.3 程序执行
    1. 获取程序。通过上节,我们已经有一个本地客服端程序和一个服务器程序,下载请点击
    2. 打开cmd。如果没有配置PHP的环境变量请查看:3.1
    3. 执行命令cd desktop/socket。注意:这个路径需要根据自己实际情况填写,直接下载的应该是cd desktop/simple-socket-php/local-client-server主要目的是为了找到server.php所在的文件夹,根据自己文件夹位置填写相应路径。
    4. 执行服务器程序php server.php。我们发现cmd卡住了,这个时候在等待客户端连接进来。这个时候如果报错PHP Fatal error,请查看点击查看解决方法(如果想强制退出进程按下Ctrl+C
      PHP peut-il implémenter la communication socket ?
    5. 再打开一个cmd
    6. 执行命令cd desktop/socket。注意:这个路径需要根据自己实际情况填写,直接下载的应该是cd desktop/simple-socket-php/local-client-server主要目的是为了找到client.php所在的文件夹,根据自己文件夹位置填写相应路径。
    7. 执行客户端程序php client.php。(如果想强制退出进程按下Ctrl+C
      PHP peut-il implémenter la communication socket ?
      如果服务器没有反应,请按下Ctrl+C结束进程,重新按照顺序(先在一个CMD执行server.php,再在另一个CMD执行client.php)执行程序。如有疑问,请留言。

    4 结束

    到这里,我们已经实现了基本的socket通信,当然,这个程序是完全不能实际应用的,如果想要实际应用,需要增加很多细节方面的东西,有一个做的比较好的Workerman,大家可以自行搜索。
    之后我会更新如何把这个server.php在自己的阿里云服务器上面运行,这样,我们就可以随时连接进去实现客服端的相互通信了。如果有兴趣可以关注等待。

    推荐学习:《PHP视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en 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