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

如何使用GoEasy实现PHP与Websocket实时通信

发布网友 发布时间: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

如何使用GoEasy实现PHP与Websocket实时通信
实现步骤如下:
1. 获取GoEasy appkey.
在goeasy官网上注册一个账号,并新建一个app. APP创建好后系统会为该app自动生成两个key, 一个既可以用来接收又可以用来推送 (supper key),另一个只可以用来接收(subscriber key).
2. 客户端订阅一个channel.
a. 在客户端引入goeasy.js, js地址:
需要注意的是,不能将goeasy.js下载到本地,因为goeasy会根据不同浏览器来提供不同的js. 官网上也有相应说明。
b. 订阅代码
var goEasy = new GoEasy({appkey: 'subscriber key'});//这里我用的是subscriber key,因为在我的客户端我不需要推送任何消息,所以没有必要使用supper key
goEasy. subscribe({
channel: 'csdnNotification',
onMessage: function(message){
alert('Meessage received:'+message.content);//接收到推送的消息
}
});
复制代码
3. 前台推送及后台推送
3.1. 前台往相同channel上推送
在引入了goeasy.js的页面,直接调用goEasy. publish('csdnNotification', '您的好友222已上线'); 用法与订阅类似。
3.2. 后台往相同channel上推送. 用GoEasy提供的restful API实现
API url:
方式: Post
参数列表:
channel: 'csdnNotification' //与订阅的channel必须一致,否则客户端将收不到消息。因此我们也可以根据channel来控制哪些客户端可以接收。
appkey: 'supper key' //这里必须使用supper key
content: 'blabla…..' //要推送的内容
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
生长素的主要作用是?用赤霉素涂茄子(有种子的)糖皮质激素不等于肾上腺皮 ... 从深圳西丽怎么去大鹏古城怎么坐公交车啊呀 在深圳,你用12580主要做什么?如果你没有用过?你为什么不用?_百度... 请问如何把百度空间里文章分类,文章存档和最新评论的白色底色去掉? 属狗申时出生的男孩 女孩命运怎么样 化妆品保湿原料有哪些 即热式和储水式饮水机哪个好 即热跟桶装的热水器那个省电 在地铁被人叫住说是兼职,是雅姿的,培训360元,大家听说过么?_百度... 雅姿护肤品的过人之处 模仿苹果12摄像头的安卓手机什么安座机的摄像头跟iPhone12一样_百度问一问 只有没有密码可以看微信里删除的聊天记录嘛? 没对方的微信密码,能调出聊天记录不 颜字的三撇在颜体中怎样避免重复 牙龈经常出血到底是什么原因? 和多年不见以前关系很好的人朋友聊天会不会尴尬? 英语单词背不过,尤其是一个词很多字母的那种,怎么办? 牙龈总出血是什么个原因? 1,驱,2,龄,3,诱,4,鼎.按音序,部首笔画数,笔画数由少到多或由多到少排列应该是什么? 为什么牙龈总是出血? 李寒尽这个名字有多少笔画? 三横、三竖、三撇、三捺。(猜一字)是什么? 我的牙龈总是出血,不同的位置,白天没什么刺激的时候就出血。 部首三撇儿与什么有关 所有带三撇的字都有什么? 比或多三撇的字 在或字的撇地方多两个撇 一共三个撇?? 比或多三撇的字 或加三撇念什么 或字上有三撇念什么 或三撇 读什么 安卓系统,能抗衡苹果相机的,有哪几个 恢复微信聊天记录需要id密码吗 请问你用了安卓仿苹果的机子觉得好用吗?优缺点是什么? 不用微信密码能查看聊天记录吗 如果只有没有密码可以看微信里删除的聊天记录吗? 不知道微信密码可以看该号码的聊天记录吗 没有微信密码能看聊天记录吗 小白兔过河看图写话二年级作文怎么写 《资本论》的读后感怎么写? 跑步的时候手机放在哪里最好 看图写话小白兔,小鸭子,乌龟大熊过桥怎么写? 《资本论》读后感 戴手表跑步手机放哪里 读《资本论》有感 跑步的时候手机放到哪比较好 资本论的读后感 看图写话两只小兔子吃西瓜过河一天,两只可爱的小白光一起去找口气的。 跑步手机怎么放 读《资本论》有何感想? 资本论读后感