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

php怎么用websocket做ie也可以支持的多人聊天室

发布网友 发布时间:2022-04-07 05:01

我来回答

2个回答

懂视网 时间:2022-04-07 09:22

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-07 06:30

一个端口就够了。底层实现就是socket的链接。每次server端accept一个链接就会创建一个新的socket用于会话。你可以创建一个类room,包含两个ws,当链接之后,把ws填入到room中。满了就可以开始聊天室。然后server继续等待新的ws
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
远得要命的爱情丁菲是谁演的 远的要命的爱情里的乔佳影是谁演的 远得要命的爱情乔佳影是什么角色 问。。我在厦门办的银行卡回江西可以用吗? 远得要命的爱情中的乔佳影是个怎样的人 厦门农信社的公告出来了,想问一下银行合同制和劳务派遣和正式工的区别... 厦门的信用社银联卡到南宁能不能用?要不要手续费? 泉州农信社年前新办的卡,存了钱,银行说三个工作日后才能动这个钱,为什 ... ...女鞋的话 是不是必须直通车 我们鞋子都是20---50鞋子利润低 直通车... 拼多多直通车200红包(拼多多直通车每天烧1000) 喀纳斯为什么十一过后就封山了? 攒珠穴怎么下针,针灸时怎么下针,直刺还是斜刺? 攒珠成链的读音? 喀纳斯是高原还是盆地还是丘陵或平原 聚沫攒珠,是什么意思? 攒珠髻的“攒”应念什么? 韩国传统辣白菜怎么做? 求韩国泡菜辣白菜制作方法 魅蓝note6这样了,怎么解锁 魅蓝note6一直这样子开解不开锁屏。该怎么办?在线求回答。 美的电饭煲显示EU,维修师傅给换了主板。但煮饭的预约时间还是原来的,请 ... 魅族note6强制清除锁屏密码? 二年级看图写话指导——小白兔过河采蘑菇 请问 关于资本论的读书笔记怎么写啊, 看图写话二年级下册小白兔和大象过河 资本论第二章货币和商品流通读后感 读《资本论》有什么现实意义? 二年级看图写话,小白兔怎么过的河 怎么解除魅蓝note6锁屏密码? 资本论第一卷读后感 攒珠髻的“攒”应念什么?攒珠髻的“攒”应念什么? 最新,威海2017年社保缴费基数确定,哪些人下个月必须缴费 微信中不是通讯录拉黑后怎么恢复吗 头上戴着金丝八宝攒珠髻,这段文字你仿佛看到了一位怎样的女子? 宋代哥窑传世绝品鉴定法则是什么? 威海2017年社保缴费基数确定,哪些人下个月必须缴费 求女子古风簪钗名称,一百个左右 2017年威海荣成个人自己交社保基数是多少 你的论点是明以前瓷器少有气泡,而哥窑特征里有聚沫掇珠这一说还能成立吗? 2017养老保险交多少钱 2017养老保险的缴纳比例是多少? 2017养老保险缴费基数 2017年什么是养老保险缴费基数 三星t705c怎么下微信运动 三星t705c怎么下微信运动 2017年养老保险社会金缴纳标准是多少 把个人微信已经开通了消息免打扰怎么把语音这个声音也给他取消关闭_百度问一问 成都江北机场首航行李卡的严吗(28寸的)? 腾讯会议显示我的手机号已绑定其它而无法登录腾讯会议怎么办? 腾讯会议显示我的手机号已绑定其它而无法登录腾讯会议怎么办?_百度问一问