环境配置:
     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. cocos2dx内存管理机制

    参考以下两篇文章 http://blog.csdn.net/ring0hx/article/details/7946397 http://blog.csdn.net/whuancai/article/ ...

  2. 关于oracle的profiles

    一.关于oracle的profiles profiles文件是口令和资源限制的配置集合,包括CPU的时间.I/O的使用.空闲时间.连接时间.并发会话数量.密码策略等对于资源的使用profile可以做到 ...

  3. 简单桶排序算法-python实现

    #-*- coding: UTF-8 -*- import numpy as np def BucketSort(a, n): barrel = np.zeros((1, n), dtype = 'i ...

  4. vim之YCM配置

    BundleInstall,默认会出现错误 ycm_client_support.[so|pyd|dll] and ycm_core.[so|pyd|dll] not detected; you ne ...

  5. 从后台读取项目文件在前端iframe中展示

    项目中有个需求是: 对于外部提供的前端项目,包含css.js.html.图片等的项目,将这个项目存进数据库,然后iframe中展示html,然后html中引用的js.css等文件 也能从数据库中读取并 ...

  6. java DecimalFormat类

          今天去面试了,需要上机做题.题目的内容是计算一个货物订单的税费和总价格(包括税费),结果需要精确到两个小数,同时按照如下规则进行处理: 3.01 ——>3.05, 2.48——> ...

  7. py基础4--迭代器、装饰器、软件开发规范

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1. 列表生成式,迭代器&生成器 列表生成式 我现在有个需求, ...

  8. CUDA 新版本 Visual Studio 和 CUDA 兼容性的小问题

    ▶ 升级到 Visual Studio 2017 和 CUDA 9.1 之后,直接编译以前的 CUDA C 程序出现了如下报错: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E00 ...

  9. Tomcat 实战-调优方案

    来自:  http://blog.csdn.net/u010028869/article/details/51793821 来自:  https://www.cnblogs.com/baihuites ...

  10. HTTP --meta详解

    meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言, ...