用过workerman, 两个字"好用",对于swoole最近有时间也研究研究

swoole的websocket 很好实现

如官网 https://wiki.swoole.com/wiki/page/479.html

ws_server.php

//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502); //监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
var_dump($request->fd, $request->get, $request->server);
$ws->push($request->fd, "hello, welcome\n");
}); //监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
echo "Message: {$frame->data}\n";
$ws->push($frame->fd, "server: {$frame->data}");
}); //监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
}); $ws->start();

运行程序

php ws_server.php

客户端 a.html

var wsServer = 'ws://127.0.0.1:9502';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) {
console.log("Connected to WebSocket server.");
}; websocket.onclose = function (evt) {
console.log("Disconnected");
}; websocket.onmessage = function (evt) {
console.log('Retrieved data from server: ' + evt.data);
}; websocket.onerror = function (evt, e) {
console.log('Error occured: ' + evt.data);
};

ok了!

现在我们看到的是客户端发送信息,服务器应答并返回数据

那我们现在要的是服务器主动发送信息

有三个办法:

1.使用swoole的定时器,定时发送,可通过syc从数据库获取数据逻辑判断后push发送给客户端

2.使用swoole中自带框架

这个方法和方法3原理是一样的,就是需要后台主动推送的时候,模拟一个客户端发送消息,可以是CLI的脚本,也可以是php的CURL请求

https://github.com/matyhtf/framework/blob/master/libs/Swoole/Client/WebSocket.php

github下载地址:https://github.com/matyhtf/framework

<?php
define('DEBUG', 'on');
define("WEBPATH", str_replace("\\", "/", __DIR__));
require __DIR__ . '/framework-master/libs/lib_config.php';
$client = new Swoole\Client\WebSocket('127.0.0.1', 9502);
if (!$client->connect()) {
echo "connect to server failed.\n";
exit;
} $client->send("我是PHP-client端,发来的消息"); # 客户端可以看到

3.设置onRequest回调

用过workerman的都知道,workerman中就有这个获取http的get,post 数据并sendto客户端,在这里swoole也可以实现

https://wiki.swoole.com/wiki/page/397.html

swoole_websocket_server 继承自 swoole_http_server

    • 设置了onRequest回调,websocket服务器也可以同时作为http服务器
    • 未设置onRequest回调,websocket服务器收到http请求后会返回http 400错误页面
    • 如果想通过接收http触发所有websocket的推送,需要注意作用域的问题,面向过程请使用“global”对swoole_websocket_server进行引用,面向对象可以把swoole_websocket_server设置成一个成员属性

代码如下

ser.php

<?php

class MyWebsocket {

    private $server;
private $fid=[];
# run()
public function toRun() {
$this->server = new swoole_websocket_server("0.0.0.0", 9502, SWOOLE_BASE, SWOOLE_SOCK_TCP); //SWOOLE_SSL 需要ssl才加
#监听WebSocket连接打开事件
$this->server->on('open', function ($server, $request) {
$this->server->push($request->fd, "hello, welcome ID:{$request->fd}\n");
$this->fid[]=$request->fd; # $request->fd fd
});
#监听WebSocket消息事件
$this->server->on('message', function ($server, $frame) { #$frame->data 消息内容
$msg = 'from' . $frame->fd . ":{$frame->data}\n";
foreach ($this->fid as $fd) {
$server->push($fd, $msg);
}
}); //监听WebSocket连接关闭事件
$this->server->on('close', function($ws, $fd) {
$fd_key = array_search($fd, $this->fid ? $this->fid : []);
$key_zero = isset($this->fid[0]) && $this->fid[0] == $fd ? TRUE : FALSE; # key=0
if ($fd_key || $key_zero) {
unset($this->fid[$fd_key]);
}
echo "client-{$fd} is closed\n";
}); #onRequest回调 http://127.0.0.1:9502/?sendto=1,20,3&message=%E4%BD%A0%E5%A5%BD
$this->server->on('request', function ($req, $respone) {
# get 两个参数, userid "," 发送消息
$list=[];
if (isset($req->get['sendto']) && isset($req->get['message'])) {
$user = explode(',', $req->get['sendto']);
$list = array_intersect($this->fid, $user);
if (!empty($list)) {
foreach ($list as $fd) {
$this->server->push($fd, $req->get['message']);
}
}
}
$total= count($this->fid);
$sendSum= count($list);
$respone->end("Current fid:{$respone->fd}, OnLine:{$total}, Send:{$sendSum}"); }); $this->server->start();
} } $app = new MyWebsocket();
$app->toRun();

客户端html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="msg"></div>
<input type="text" id="text">
<input type="submit" value="发送数据" onclick="sending()">
</body>
<script>
var msg = document.getElementById("msg");
var wsServer = 'ws://127.0.0.1:9502';
//调用websocket对象建立连接:
//参数:ws/wss(加密)://ip:port (字符串)
var websocket = new WebSocket(wsServer);
//onopen监听连接打开
websocket.onopen = function (evt) {
//websocket.readyState 属性:
/*
CONNECTING 0 The connection is not yet open.
OPEN 1 The connection is open and ready to communicate.
CLOSING 2 The connection is in the process of closing.
CLOSED 3 The connection is closed or couldn't be opened.
*/
console.log(websocket.readyState);
}; function sending() {
var text = document.getElementById('text').value;
document.getElementById('text').value = '';
//向服务器发送数据
websocket.send(text);
}
//监听连接关闭
websocket.onclose = function (evt) {
msg.innerHTML+="Disconnected<br>";
}; //onmessage 监听服务器数据推送
websocket.onmessage = function (evt) {
msg.innerHTML += evt.data + '<br>';
console.log('Retrieved data from server: ' + evt.data);
};
//监听连接错误信息
websocket.onerror = function (evt, e) {
console.log('Error occured: ' + evt.data);
}; </script>
</html>

运行

php ser.php 

swoole websocket服务推送的更多相关文章

  1. swoole WebSocket 消息推送

    server.php <?php //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $r ...

  2. node.js Websocket消息推送---GoEasy

    Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送 速度快,代码简单易懂上手快 浏览器兼容性:GoEasy推送 支持websocket ...

  3. C(++) Websocket消息推送---GoEasy

    Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送 速度快,代码简单易懂上手快 浏览器兼容性:GoEasy推送 支持websocket ...

  4. 【WebSocket】WebSocket消息推送

    准备使用WebSocket实现Java与Vue或者安卓间的实时通信,实现私密聊天.群聊.查询下资料备用. WebSocket客户端 websocket允许通过JavaScript建立与远程服务器的连接 ...

  5. 搭建websocket消息推送服务,必须要考虑的几个问题

    近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对websocket的要求也越来越高.从早期对websocket的应 ...

  6. HTML5学习总结-08 WebSocket 服务器推送

    一 WebSocket 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展 ...

  7. HTML5 WebSocket 实时推送信息测试demo

    测试一下HTML5的websocket功能,实现了客户端→服务器实时推送信息到客户端,包括推送图片: websocket实现MessageInbound类 onTextMessage()/onBina ...

  8. 使用swoole进行消息推送通知,配合vb.net进行客户端开发一样爽[开发篇]

    在以前的项目中,就曾听说过swoole的大名,想用来进行消息推送,但是当时只是有了初步的了解,并不敢大胆的运用到线上产品.所谓 识不足则多虑,威不足则多怒.所以就是怕,只能跟领导说了运用极光的推送功能 ...

  9. WebSocket消息推送

    WebSocket协议是基于TCP的一种新的网络协议,应用层,是TCP/IP协议的子集. 它实现了浏览器与服务器全双工(full-duplex)通信,客户端和服务器都可以向对方主动发送和接收数据.在J ...

随机推荐

  1. PMP(项目管理)备考资料汇总-来自多名项目经理的总结

    上重点,所有的相关总结文档(备考计划<务必仔细看一遍>.总结.提升方法等).含易混点区分的思维导图都在QQ群里:931269244 所有整理资料的汇总说明有时候别人会问我,你这是图什么呢, ...

  2. django 1.开发接口环境搭建

    首先需要的环境: pycharm Python 3.6.0 django 2.1.3        安装命令: pip3 install django   查看版本号和安装的路径: pip show ...

  3. seq2seq

    seq2seq: seq2seq就是将输入序列经过encoder-decoder变成目标序列. 如图所示,输入序列是 [A, B, C, <EOS>],输出序列是  [W, X, Y, Z ...

  4. uboot2012(一)分析重定位

    目录 引入 环境配置 编译体验 入口查找 代码分析 board_init_f pie 内存分布分析 SP设置 board_init_f 重定位 代码段重定位实现 变量地址修改 参考 title: ub ...

  5. NameNode与DataNode的工作原理剖析

    NameNode与DataNode的工作原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HDFS写数据流程 >.客户端通过Distributed FileSyst ...

  6. 重新安装了环境报错{"error":"could not find driver"}

    前言:最近新工作开发oa系统,没有借助工具安装wamp环境,结果在测试项目时候出现了bug,找了很久,发现方向没有对 报错信息: {"error":"could not ...

  7. [源码分析]读写锁ReentrantReadWriteLock

    一.简介 读写锁. 读锁之间是共享的. 写锁是独占的. 首先声明一点: 我在分析源码的时候, 把jdk源码复制出来进行中文的注释, 有时还进行编译调试什么的, 为了避免和jdk原生的类混淆, 我在类前 ...

  8. 【Unity游戏开发】你真的了解UGUI中的IPointerClickHandler吗?

    一.引子 马三在最近的开发工作中遇到了一个比较有意思的bug:“TableViewCell上面的某些自定义UI组件不能响应点击事件,并且它的父容器TableView也不能响应点击事件,但是TableV ...

  9. 实验二 Java面向对象程序设计 20175301李锦然实验报告

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  10. CAD快捷键

    F1: 获取帮助 F2: 实现作图窗和文本窗口的切换 F3: 控制是否实现对象自动捕捉 F4:数字化仪控制 F5: 等轴测平面切换 F6: 控制状态行上坐标的显示方式 F7: 栅格显示模式控制 F8: ...