环境配置:
     swoole 1.9.3、centos6.5(虚拟机)、PHP7.01
 
思路:
     ①通过server中的collections取出fd
     ②写一个admin.html(管理员推送页面) 与 client.html(客户端),html页面的websocket自行可编写
          并在server.php中message事件用循环push数据(server中的collections取出fdfd组)    
$serv->on('Message', function ($server, $frame) {
echo "\n message: " . $frame->data . "\n"; foreach ($server->connections as $key => $value) {
if($frame->fd != $value){
$server->push($value, "客户{$value}:".$frame->data);
}
}
});

注:其实这里需要admin.html发送数据时传token并在message事件中验证是否管理员请求(数据库操作),是才执行推送,否则不做操作

server.php代码如下:

<?php
$serv = new Swoole\Websocket\Server("0.0.0.0", 9502); $serv->on('Open', function ($server, $req) {
echo "\n connection open: " . $req->fd . "\n";
}); $serv->on('Message', function ($server, $frame) {
echo "\n message: " . $frame->data . "\n"; foreach ($server->connections as $key => $value) {
if($frame->fd != $value){
$server->push($value, "客户{$value}:".$frame->data);
}
}
}); $serv->on('Close', function ($server, $fd) {
echo "\n connection close: \n" . $fd;
}); $serv->start();

效果图:

注:客户端websocket自行编写。

上面推送小实例实现中有点问题,并未将客户端与服务端分离开来,以下分离开。
     因为swoole_websocket_server 继承自 swoole_http_server,所以可在websocket中用Request事件,另外用global引入用于在Request事件中push
①首先admin.html改为http请求,且client.html保持不变
 
<form method="post" action="http://localhost:9502/server.php">
<input name="test" type="text" placeholder="please input something">
<input type="submit" value="submit">
</form>

②将Message事件的push部分删掉,如下:

$serv->on('Message', function ($server, $frame) use($redis) {
echo "\n message: " . $frame->data . "\n";
//将来可用于写数据库信息
});

③添加http的Request事件,如下:

//服务端请求更新数据,这里是http方式
$serv->on('Request', function ($req, $respone) {
global $serv; //全局引入$serv
global $redis; //全局引入redis
print_r($req->post);
if(count($req->post)){ //判断下是否有数据
foreach (@$serv->connections as $key => $value) {
@$serv->push($value, "客户{$value}:".$req->post["test"]);
}
$respone->end("success");
}
});

swoole实现websocket推送的更多相关文章

  1. 用 Go 编写一个简单的 WebSocket 推送服务

    用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...

  2. Golang websocket推送

    Golang websocket推送 在工作用主要使用的是Java,也做过IM(后端用的netty websocket).最近想通过Golang重写下,于是通过websocket撸了一个聊天室. 项目 ...

  3. 模拟websocket推送消息服务mock工具二

    模拟websocket推送消息服务mock工具二 在上一篇博文中有提到<使用electron开发一个h5的客户端应用创建http服务模拟后端接口mock>使用electron创建一个模拟后 ...

  4. GoEasy实现websocket 推送消息通知到客户端

    最近在实现一个推送功能,用户扫描二维码签到,后台及时将签到成功信息推送到浏览器端.排除了前端ajax轮询的方式,决定采用websocket及时推送. 于是发现了第三方websocket推送库GoEas ...

  5. 小谢第37问:关于websocket推送进度,本地保存进度条,然后跳出页面进入后再显示的问题

    1.主要技术点:sessionStorage 会话存储进度 这里在使用之前,顺便说一下cookie.sessionStorage.localStorage 共同点:都是保存在浏览器端,且同源的. 区别 ...

  6. 利用奇偶数来获取websocket推送时间间隔(或者比较前一个数和下一个数的变化)

    利用奇偶数来获取websocket推送时间间隔(或者比较前一个数和下一个数的变化) 在vue中的 data () {     return { countTime: 0,         newDat ...

  7. 基于Java的WebSocket推送

    WebSocket的主动推送 关于消息推送,现在的解决方案如轮询.长连接或者短连接,当然还有其他的一些技术框架,有的是客户端直接去服务端拿数据. 其实推送推送主要讲的是一个推的概念,WebSocket ...

  8. web全栈应用【爬取(scrapy)数据 -> 通过restful接口存入数据库 -> websocket推送展示到前台】

    作为 https://github.com/fanqingsong/web_full_stack_application 子项目的一功能的核心部分,使用scrapy抓取数据,解析完的数据,使用 pyt ...

  9. 从构建分布式秒杀系统聊聊WebSocket推送通知

    秒杀架构到后期,我们采用了消息队列的形式实现抢购逻辑,那么之前抛出过这样一个问题:消息队列异步处理完每个用户请求后,如何通知给相应用户秒杀成功? 场景映射 首先,我们举一个生活中比较常见的例子:我们去 ...

随机推荐

  1. emacs之配置8,gdb调试设置

    emacsConfig/gdb-setting.el (global-set-key [(f5)] 'gud-go) (global-set-key [(f7)] 'gud-step) (global ...

  2. redis与lua

    内容大纲 redis里使用eval和evalsha redis管理Lua脚本  php里使用redis的lua脚本 在redis里使用lua脚本的好处 1.Lua脚本在Redis中是原子执行的,执行过 ...

  3. bzoj1067 降雨量

    Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003, ...

  4. libevent源码学习

    怎么快速学习开源库比如libevent? libevent分析 - sparkliang的专栏 - 博客频道 - CSDN.NET Libevent源码分析 - luotuo44的专栏 - 博客频道 ...

  5. 【BZOJ】3191 [JLOI2013]卡牌游戏(概率dp)

    题目 传送门:QWQ 分析 算是概率dp不错的题. $ dp[i][j] $表示有i个人时,这i个人中的第j个获胜的概率. 我们把i从1推到n,那么答案就是$ dp[n][i] $ 然后我们规定,第一 ...

  6. var和let示例

    声明后未赋值,表现相同 (function() { var varTest; let letTest; console.log(varTest); //输出undefined console.log( ...

  7. blktrace btt结果分析

    对于btt的结果分析十分的困难,我和同事花了很多的时间在网上查找btt输出的每一项参数的意义,试图更好的分析bio的统计信息,但网上文章一大抄,翻来覆去就是那几篇文章. 本文中内容参考了以下网址: 1 ...

  8. Quartz实现JAVA定时任务的动态配置

    什么是动态配置定时任务? 首先说下这次主题,动态配置.没接触过定时任务的同学可以先看下此篇:JAVA定时任务实现的几种方式 定时任务实现方式千人千种,不过基础的无外乎 1.JDK 的Timer类 2. ...

  9. django-admin添加权限

    后台manage页面: 可以通过用户直接添加权限,如果需要添加多个权限,则可以通过组,先将多个权限添加个组(总经理,秘书),在个用户添加这个组(总经理,秘书).  代码实现: 实际就是添加多对多的关系 ...

  10. pandas的数据结构

    要使用pandas,需要熟悉它的两个主要的数据结构,Series和DataFrame. Series series是一种类似于以为数组的对象,它由一组数据(各种numpy的数据类型)以及一组与之相关的 ...