问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php 怎么实现websocket

发布网友 发布时间:2022-04-29 05:58

我来回答

3个回答

懂视网 时间:2022-04-29 10:20

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》

热心网友 时间:2022-04-29 07:28

关于这个问题,首先,已经很有几个热心人士回答了,我再重复一遍,也没有什么意义一,而且他们回答的都很对,你如果不明白,问他们也可以问我也可以,我这些都是在后盾上学的,有空可以去看一下,就算不喜欢也没关系啊,何乐而不为呢?

热心网友 时间:2022-04-29 08:46

用框架workerman 或者swoole,专做这个的
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
dell电脑散热是按哪个键 风水中的北方与肾的关系 20分+100分 哈尔滨近期招聘会 哈尔滨信息港的基本信息 哈尔滨信息港基本信息 哈尔滨市最近的招聘信息? 黑龙江省招聘查询入口(龙招港黑龙江招生网2020招聘信息)? 小区车位如何配比 身上红点不痛不痒是怎么回事 万家乐LJSQ20-12UF1保修信息 有“妈妈的故事还在讲”歌词的歌哪能下到? 睡醒前听到的声音醒后会不会有印象? 爸爸我做了一个梦,梦见自己变成喜洋洋这是什么歌 福鼎白茶有哪些牌子,好像听说礼小茶不错的? 福鼎白茶,那一家的品牌质量比较好? 梦见大黑狼追我报恩? 福鼎白茶买哪种好?都有什么品牌? 泰歌是谁 福鼎白茶加入哪个好?福鼎白茶五大品牌排行榜 国号白茶和品品香白茶哪个好 川流不息。 什么牌子的福鼎白茶正宗? 川流不息什么意思啊 川流不息!指的是啥意思 川流不息的意思 川流不息指的是什么 “川流不息”是什么意思? “川流不息”的意思是什么? 川流不息什么意思? 川流不息意思 或三撇 读什么 或字上有三撇念什么 或加三撇念什么 比或多三撇的字 比或多三撇的字 在或字的撇地方多两个撇 一共三个撇?? 所有带三撇的字都有什么? 部首三撇儿与什么有关 我的牙龈总是出血,不同的位置,白天没什么刺激的时候就出血。 三横、三竖、三撇、三捺。(猜一字)是什么? 李寒尽这个名字有多少笔画? 为什么牙龈总是出血? 1,驱,2,龄,3,诱,4,鼎.按音序,部首笔画数,笔画数由少到多或由多到少排列应该是什么? 牙龈总出血是什么个原因? 英语单词背不过,尤其是一个词很多字母的那种,怎么办? 和多年不见以前关系很好的人朋友聊天会不会尴尬? 牙龈经常出血到底是什么原因? 颜字的三撇在颜体中怎样避免重复 没对方的微信密码,能调出聊天记录不 只有没有密码可以看微信里删除的聊天记录嘛? 模仿苹果12摄像头的安卓手机什么安座机的摄像头跟iPhone12一样_百度问一问