swoole实现websocket推送

环境配置:
     swoole 1.9.3、centos6.5(虚拟机)、PHP7.01

思路:
     ①通过server中的collections取出fd
     ②写一个 admin.html(管理员推送页面) 与 client.html(客户端),html页面的websocket自行可编写
          并在server.php中message事件用循环push数据(server中的collections取出fdfd组)    
  1. $serv->on('Message'function ($server$frame) {  
  2.     echo "\n message: " . $frame->data . "\n";  
  3.   
  4.   
  5.     foreach ($server->connections as $key => $value) {  
  6.        if($frame->fd != $value){  
  7.           $server->push($value"客户{$value}:".$frame->data);  
  8.        }  
  9.     }  
  10. });  
注:其实这里需要admin.html发送数据时传token并在message事件中验证是否管理员请求( 数据库操作),是才执行推送,否则不做操作

server.php代码如下:
  1. <?php  
  2. $serv = new Swoole\Websocket\Server("0.0.0.0", 9502);  
  3.   
  4.   
  5. $serv->on('Open'function ($server$req) {  
  6.     echo "\n connection open: " . $req->fd . "\n";  
  7. });  
  8.   
  9.   
  10. $serv->on('Message'function ($server$frame) {  
  11.     echo "\n message: " . $frame->data . "\n";  
  12.   
  13.   
  14.     foreach ($server->connections as $key => $value) {  
  15.        if($frame->fd != $value){  
  16.           $server->push($value"客户{$value}:".$frame->data);  
  17.        }  
  18.     }  
  19. });  
  20.   
  21.   
  22. $serv->on('Close'function ($server$fd) {  
  23.     echo "\n connection close: \n" . $fd;  
  24. });  
  25.   
  26.   
  27. $serv->start();  

效果图:


注:客户端websocket自行编写。

上面推送小实例实现中有点问题,并未将客户端与服务端分离开来,以下分离开。
     因为swoole_websocket_server 继承自 swoole_http_server,所以可在websocket中用Request事件,另外用global引入用于在Request事件中push


①首先admin.html改为http请求,且client.html保持不变
  1. <form method="post" action="http://localhost:9502/server.php">  
  2.     <input name="test" type="text" placeholder="please input something">  
  3.     <input type="submit" value="submit">  
  4. </form>  

②将Message事件的push部分删掉,如下:
  1. $serv->on('Message'function ($server$frameuse($redis) {  
  2.     echo "\n message: " . $frame->data . "\n";  
  3.      //将来可用于写数据库信息  
  4. });  

③添加http的Request事件,如下:
  1. //服务端请求更新数据,这里是http方式  
  2. $serv->on('Request'function ($req$respone) {  
  3.     global $serv;    //全局引入$serv  
  4.     global $redis;     //全局引入redis  
  5.     print_r($req->post);  
  6.     if(count($req->post)){ //判断下是否有数据  
  7.         foreach (@$serv->connections as $key => $value) {      
  8.             @$serv->push($value"客户{$value}:".$req->post["test"]);  
  9.         }  
  10.         $respone->end("success");  
  11.     }  
  12. }); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值