帝国CMS模板大全
www.admin99.cn
www.92cms.cn 帝国CMS模板下载站!,情怀,养站,二次开发!源码需求比较大的一站式会员下载,价更省!!!

php如何实现websocket

php如何实现websocket

首先在php代码中创建socket服务并监听端口信息;

//传相应的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;
}

然后设计一个循环挂起websocket通道,进行数据的接收、处理和发送;

//对创建的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(
'socket'=>$client,  //记录新连接进来client的socket信息
'shou'=>false  //标志该socket资源没有完成握手
 );
  //否则1.为client断开socket连接,2.client发送信息
  }else{
 $len=0;
 $buffer='';
 //读取该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]['shou']){
//如果没有握手,则进行握手处理
$this->woshou($k,$buffer);
 }else{
//走到这里就是该client发送信息了,对接受到的信息进行uncode处理
$buffer = $this->uncode($buffer,$k);
if($buffer==false){
    continue;
}
//如果不为空,则进行消息推送操作
$this->send($k,$buffer);
 }
  }
   }
    
    }

}

最后等待客户端进行连接即可。

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

推荐教程:《PHP教程》《PHP7》

以上就是php如何实现websocket的详细内容,更多请关注Gxlcms其它相关文章!

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《php如何实现websocket》
文章链接:https://www.admin99.cn/8445
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
QQ站长交流群:953950264

登录

找回密码

注册