Heim >Backend-Entwicklung >PHP-Problem >Kann PHP Socket-Kommunikation implementieren?

Kann PHP Socket-Kommunikation implementieren?

藏色散人
藏色散人Original
2023-02-09 10:09:053612Durchsuche

php kann Socket-Kommunikation implementieren: 1. Erstellen Sie „socketsocket_create();“ und fordern Sie eine Verbindung zum Server „socket_connect();“ an Server und Bindung Legen Sie die IP- und Portnummer „socket_bind();“ fest. 3. Lesen Sie die Nachrichten des Clients oder schreiben Sie Nachrichten an den Client über „socket_wirte();socket_read“.

Kann PHP Socket-Kommunikation implementieren?

Die Betriebsumgebung dieses Tutorials: Windows 10-System, PHP-Version 8.1, DELL G3-Computer

Kann PHP Socket-Kommunikation erreichen?

Socket-PHP: Detaillierte und einfache Socket-TCP-Kommunikations-PHP-Implementierung

1 Hintergrundeinführung

Ziel: Ich hoffe, einen Server durch Socket-TCP-Übertragung aufzubauen. Die Funktion dieses Servers besteht darin, mehrere Client-Endverbindungen zu akzeptieren vervollständigen ihre gegenseitige Kommunikation. Beispielsweise sind Client A und Client B gleichzeitig mit Server S verbunden. Client A sendet eine Nachricht an Server S. Server S leitet die Nachricht von A an B weiter. Ebenso kann die Nachricht von B auch über S an A weitergeleitet werden. Auf diese Weise wird eine gegenseitige Kommunikation zwischen Kunde A und Kunde B erreicht. Diesmal implementieren wir nur die Verbindung und Kommunikation zwischen Client und Server und verfügen vorerst nicht über die Weiterleitungsfunktion des Servers.

2 Eine kurze Einführung in TCP

2.1 Der „Drei-Wege-Handshake“ von TCP

Der Drei-Wege-Handshake von TCP kann eine normale Kommunikation zwischen dem Server und dem Client sicherstellen. Drei-Wege-Handshake-Prozess: Zur Erläuterung dieses Prozesses können Sie auf den Link unten klicken, um ihn anzuzeigen.


Kann PHP Socket-Kommunikation implementieren? Referenz: https://www.php.cn/link/70203474234c15a59de1eacc053f5690

2.2 IP und PORT

Der Server muss eine IP und eine Portnummer für die TCP-Kommunikation haben.

Der Kundendienst muss über eine IP verfügen und bei der Kommunikation mit TCP auch eine Portnummer angeben.

Persönliches Verständnis: IP ist eine Adresse, die als Haus verstanden werden kann. Wenn Sie eine Kommunikation herstellen müssen, müssen Sie zuerst wissen, wo sich das Haus befindet. Ansonsten, wohin sollen wir die Informationen senden?

PORT-Port, die Portnummer kann als Tür in diesem Haus verstanden werden. Wir müssen eine Tür angeben, um Nachrichten an diese Tür zu senden oder Nachrichten von dieser Tür zu empfangen. 2.2 Kurzer Kommunikationsprozess zwischen Client und Server ;

Nachrichten an Server senden/annehmensocket_wirte(); / socket_read();

Socket schließensocket_close();

Server:
  1. Socket erstellen
  2. socket_create();
  3. IP und Portnummer bindensocket_bind();
  4. IP und Portnummer abhören (0.0.0.0 bedeutet jede IP)
  5. socket_listen();

  • Warten auf Client-Verbindung blockieren

    socket_accept ( );

  • Kundennachrichten lesen/Nachrichten an Kunden schreiben

    socket_wirte(); / socket_read();

  • Socket schließen

    socket_close();

  • 2.2

  • Der Server erstellt einen Socket, bindet IP und PORT und wechselt dann in den Überwachungsstatus, um darauf zu warten, dass der Client eine Verbindung herstellt.
  • Der Client erstellt einen Socket und verbindet sich mit der angegebenen Server-IP und dem angegebenen PORT.
  • Der Server akzeptiert die vom Client initiierte Verbindung.

Beide Parteien können sich gegenseitig Daten senden
Beide Parteien schließen die Steckdose.
    AB Sockel erstellen Erstellen Sie einen Socket, stellen Sie ihn so ein, dass er den Zugriff auf IP und PORT erlaubt.Überwachen Sie eine bestimmte (oder alle) IP-Adressen und einen bestimmten Port und geben Sie die Blockierung ein, die auf den Client wartet. Verbindung einleiten zur angegebenen Server-IP/PORT Verbindung von Client A akzeptierenBeide Parteien haben eine Verbindung hergestelltNachricht senden Kommunikation Nach Abschluss schließen A und B gleichzeitig die Steckdose

    Dies ist ein kurzer Kommunikationsprozess. Was das zyklische Senden oder die Erkennung von Anomalien betrifft, handelt es sich um einige Details.

    3 Beginnen Sie mit dem Üben

    3.1 PHP-Installation und Umgebungskonfiguration

    1. Installieren Sie PHP. Hier habe ich XAMPP direkt installiert und diese Software hat PHP selbstständig für mich installiert. Wenn Sie die PHP-Sprache zum ersten Mal verwenden, können Sie PHP direkt von Baidu aus installieren oder XAMPP installieren.
    2. Konfiguration der Systemumgebung. Wenn ich das Programm ausführe, führe ich es über cmd aus, daher muss ich die Systemumgebungsvariablen konfigurieren. Informationen zum Konfigurationsprozess finden Sie unter: Link: PHP-Umgebungsvariablenkonfiguration.
    3. Überprüfen Sie, ob der PHP-Befehl ausgeführt werden kann. Führen Sie nach Abschluss der Schritte 1 und 2 cmd aus und führen Sie den Befehl php -v aus. Nach Abschluss des Vorgangs wird die PHP-Versionsnummer angezeigt. Bildbeschreibung hier einfügenphp -v ,运行完成之后会显示PHP的版本号。Kann PHP Socket-Kommunikation implementieren?

    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部分替换到程序中的第二行并保存
      网页操作:
      Kann PHP Socket-Kommunikation implementieren?
      程序操作:
      Kann PHP Socket-Kommunikation implementieren?
    3. 打开cmd。如果没有配置PHP的环境变量请查看:3.1 PHP安装及环境配置
    4. 执行命令cd desktop/socket。目的是为了到socket文件夹,根据自己文件夹位置填写相关路径。
    5. 执行客户端程序php client.php
      3.2 Client-ProgrammKann PHP Socket-Kommunikation implementieren?

      3.2.1 Schreibprogramm

      Erstellen Sie einen neuen Ordnersocket, erstellen Sie ein neues Textdokument unter dem Ordner und benennen Sie es in „Öffnen“ um client.php
    6. für
    client.php

    HINWEIS: Mein Ordner wird auf dem Desktop erstellt

    HINWEIS: Wenn Sie normalerweise keinen PHP-Editor haben, können Sie client.php zu diesem Zeitpunkt direkt mit Notepad öffnen

    writeprogram HINWEIS: Ich werde das Programm hier direkt vorstellen und Kommentare abgeben. Sie können es anhand des 2.2-Kommunikationsprozesses verstehen. Wenn Sie Fragen haben, hinterlassen Sie bitte eine Nachricht

    🎜🎜
    <?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
    ?>
      🎜 Das Programm ist geschrieben und Sie können es direkt kopieren oder 🎜direkt herunterladen🎜. HINWEIS: Es wird ein Fehler gemeldet, wenn das Programm direkt ausgeführt wird. Bitte fahren Sie mit dem nächsten Abschnitt zur Ausführung des Programms fort . 🎜🎜🎜
      🎜3.2.2 Programmausführung
      🎜🎜🎜Holen Sie sich das Programm🎜. Im vorherigen Abschnitt haben wir bereits ein einfaches Client-Programm 🎜Klicken Sie zum Herunterladen auf 🎜. 🎜🎜🎜Gültige Ports finden🎜. Da wir derzeit keinen Server haben, müssen wir zum Debuggen die von anderen bereitgestellte Serveradresse und den Port verwenden. 🎜Bedienungsschritte:🎜 1.Klicken Sie hier, um die Webseite zu öffnen🎜🎜 2. Finden Sie unten auf der Seite: 122.114.122.174 :🎜xxxxx🎜🎜 3. Ersetzen Sie den xxxxx-Teil in der zweiten Zeile im Programm und speichern Sie 🎜 Webseitenbetrieb: 🎜Kann PHP Socket-Kommunikation implementieren?🎜 Programmbedienung: 🎜Kann PHP Socket-Kommunikation implementieren?🎜🎜🎜Öffnen Sie cmd🎜. Wenn die PHP-Umgebungsvariablen nicht konfiguriert sind, überprüfen Sie bitte: 🎜3.1 PHP-Installation und Umgebungskonfiguration 🎜🎜🎜🎜Führen Sie den Befehl 🎜cd desktop/socket aus. Der Zweck besteht darin, zum Socket-Ordner zu gehen und den entsprechenden Pfad entsprechend dem Speicherort Ihres eigenen Ordners einzugeben. 🎜🎜🎜Führen Sie das Client-Programm aus🎜php client.php. Wenn zu diesem Zeitpunkt ein schwerwiegender PHP-Fehler gemeldet wird, überprüfen Sie bitte 🎜Klicken Sie, um die Lösung anzuzeigen🎜🎜🎜🎜 Schließlich können wir sehen, dass die Informationen auf der Webseite eingegangen sind. 🎜 HINWEIS: Wenn nach der Ausführung des Programms CONNECTED nicht gedruckt wird, warten Sie eine Weile und stellen Sie fest, dass ERROR CONNET zurückgegeben wird. Dies liegt daran, dass unsere 🎜Portnummer abgelaufen ist (kann nur für 3 Minuten verwendet werden). Gehen Sie einfach zurück zur Webseite, um sie zu aktualisieren und im Programm zu ändern🎜. 🎜Wenn es nicht ordnungsgemäß ausgeführt werden kann, hinterlassen Sie bitte eine Nachricht.🎜! .3 Programmausführung. 🎜🎜
      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
        Kann PHP Socket-Kommunikation implementieren?
      5. 再打开一个cmd
      6. 执行命令cd desktop/socket。注意:这个路径需要根据自己实际情况填写,直接下载的应该是cd desktop/simple-socket-php/local-client-server主要目的是为了找到client.php所在的文件夹,根据自己文件夹位置填写相应路径。
      7. 执行客户端程序php client.php。(如果想强制退出进程按下Ctrl+C
        Kann PHP Socket-Kommunikation implementieren?
        如果服务器没有反应,请按下Ctrl+C结束进程,重新按照顺序(先在一个CMD执行server.php,再在另一个CMD执行client.php)执行程序。如有疑问,请留言。

      4 结束

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

      推荐学习:《PHP视频教程

Das obige ist der detaillierte Inhalt vonKann PHP Socket-Kommunikation implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn