Detaillierte Erläuterung von Beispielen für die Verwendung von WebSocket in PHP

伊谢尔伦
Freigeben: 2023-03-07 20:58:02
Original
21870 Leute haben es durchsucht

Was ist WebSocket?

WebSocket ist ein persistentes Protokoll, das im Vergleich zu http nicht persistent ist. Um ein einfaches Beispiel zu geben: Der Lebenszyklus von http1.0 wird durch eine Anfrage und eine Antwort definiert. Bei http endet die Sitzung zwischen dem Client und dem Server hier. Es gibt eine leichte Verbesserung, das heißt, es wird Keep-Alive hinzugefügt, das heißt, mehrere Anforderungsanfragen und mehrere Antwortannahmevorgänge können in einer http-Verbindung ausgeführt werden. Bei der Echtzeitkommunikation spielt es jedoch keine große Rolle, dass HTTP-Anfragen nur vom Client initiiert werden können und der Server keine Informationen aktiv an den Client weiterleiten kann der Echtzeitkommunikation. WebSocket kann dauerhafte Verbindungen herstellen, das heißt, der Client muss nur einen Handshake durchführen, und die Datenkommunikation kann nach Erfolg fortgesetzt werden. Es ist erwähnenswert, dass WebSocket eine Vollduplex-Kommunikation zwischen dem Client und dem Server implementiert, das heißt, der Server kann dies tun Kommunizieren Sie proaktiv, wenn Daten an den Client gesendet werden.

Die folgende Abbildung zeigt den Handshake-Teil beim Aufbau einer Websocket-Verbindung zwischen Client und Server. Dieser Teil kann sehr einfach in Node durchgeführt werden, da das von Node bereitgestellte Netzmodul dies bereits für Socket-Sockets erledigt hat Ohne Kapselungsverarbeitung müssen Entwickler bei der Nutzung nur die Interaktion der Daten berücksichtigen, ohne sich um den Aufbau von Verbindungen kümmern zu müssen.

Detaillierte Erläuterung von Beispielen für die Verwendung von WebSocket in PHP

Konversationsinhalt des Handshakes zwischen Client und Server beim Einrichten eines Sockets, also Anfrage und Antwort

a. Die vom Client beim Einrichten von WebSocket angeforderten Informationen

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket //告诉服务器现在发送的是WebSocket协议
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是一个Base64 encode的值,这个是浏览器随机生成的,用于验证服务器端返回数据是否是WebSocket助理
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: php.cn
Nach dem Login kopieren

b Durch den Client werden die Daten gemäß dem WebSocket-Protokoll verarbeitet und zurückgegeben, einschließlich Verschlüsselung und anderer Vorgänge am Sec-WebSocket-Key

HTTP/1.1 101 Switching Protocols
Upgrade: websocket //依然是固定的,告诉客户端即将升级的是Websocket协议,而不是mozillasocket,lurnarsocket或者shitsocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key,也就是client要求建立WebSocket验证的凭证
Sec-WebSocket-Protocol: chat
Nach dem Login kopieren

Erläuterung des Prozesses zum Einrichten eines Sockets in PHP

1 In PHP wird zunächst ein Socket in PHP eingerichtet und warten Sie auf Portinformationen.

<?php
//传相应的IP与端口进行创建socket操作
function WebSocket($address,$port){
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);//1表示接受所有的数据包
socket_bind($server, $address, $port);
socket_listen($server);return $server;
}
?>
Nach dem Login kopieren

2. Entwerfen Sie eine Schleife, um den WebSocket-Kanal anzuhalten, um Daten zu empfangen, zu verarbeiten und zu senden.

<?php
//对创建的socket循环进行监听,处理数据    
function run(){
  //死循环,直到socket断开
  while(true){
    $changes=$this->sockets;
    $write=NULL;
    $except=NULL;
    /*
    //这个函数是同时接受多个连接的关键,我的理解它是为了阻塞程序继续往下执行。
    socket_select ($sockets, $write = NULL, $except = NULL, NULL);
    $sockets可以理解为一个数组,这个数组中存放的是文件描述符。当它有变化(就是有新消息到或者有客户端连接/断开)时,socket_select函数才会返回,继续往下执行。 
    $write是监听是否有客户端写数据,传入NULL是不关心是否有写变化。 
    $except是$sockets里面要被排除的元素,传入NULL是”监听”全部。 
    最后一个参数是超时时间 
    如果为0:则立即结束 
    如果为n>1: 则最多在n秒后结束,如遇某一个连接有新动态,则提前返回 
    如果为null:如遇某一个连接有新动态,则返回
    */
    socket_select($changes,$write,$except,NULL);
    foreach($changes as $sock){
      //如果有新的client连接进来,则
      if($sock==$this->master){
        //接受一个socket连接
        $client=socket_accept($this->master);
        //给新连接进来的socket一个唯一的ID
        $key=uniqid();
        $this->sockets[]=$client;  //将新连接进来的socket存进连接池
        $this->users[$key]=array(
          &#39;socket&#39;=>$client,  //记录新连接进来client的socket信息
          &#39;shou&#39;=>false       //标志该socket资源没有完成握手
        );
        //否则1.为client断开socket连接,2.client发送信息
      }else{
        $len=0;
        $buffer=&#39;&#39;;
        //读取该socket的信息,注意:第二个参数是引用传参即接收数据,第三个参数是接收数据的长度
        do{
          $l=socket_recv($sock,$buf,1000,0);
          $len+=$l;
          $buffer.=$buf;
        }while($l==1000);
        //根据socket在user池里面查找相应的$k,即健ID
        $k=$this->search($sock);
        //如果接收的信息长度小于7,则该client的socket为断开连接
        if($len<7){
          //给该client的socket进行断开操作,并在$this->sockets和$this->users里面进行删除
          $this->send2($k);
          continue;
        }
        //判断该socket是否已经握手
        if(!$this->users[$k][&#39;shou&#39;]){
          //如果没有握手,则进行握手处理
          $this->woshou($k,$buffer);
        }else{
          //走到这里就是该client发送信息了,对接受到的信息进行uncode处理
          $buffer = $this->uncode($buffer,$k);
          if($buffer==false){
            continue;
          }
          //如果不为空,则进行消息推送操作
          $this->send($k,$buffer);
        }
      }
    }
  }
}
?>
Nach dem Login kopieren

Die obige Vorarbeit von WebSocket ist auf der Serverseite abgeschlossen. Warten Sie, bis die Clientverbindung hergestellt wird. Für den Client ist es sehr einfach, einen WebSocket zu erstellen. Der Code lautet wie folgt:

var ws = new WebSocket("ws://IP:端口");
//握手监听函数
ws.onopen=function(){
  //状态为1证明握手成功,然后把client自定义的名字发送过去
  if(so.readyState==1){
    //握手成功后对服务器发送信息
    so.send(&#39;type=add&ming=&#39;+n);
  }
}
//错误返回信息函数
ws.onerror = function(){
  console.log("error");
};
//监听服务器端推送的消息
ws.onmessage = function (msg){
  console.log(msg);
}
//断开WebSocket连接
ws.onclose = function(){
  ws = false;
}
Nach dem Login kopieren

[Verwandt Tutorial-Empfehlungen]

1. "php.cn Dugu Jiujian (4)-php Video-Tutorial

2. Eine vollständige Reihe von Tutorials zur PHP-Programmierung vom Einstieg bis zum Meister

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für die Verwendung von WebSocket in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!