Swoole 中使用 WebSocket 异步服务器、WebSocket 协程服务器
WebSocket 异步风格服务器
WebSocket\Server
继承自 Http\Server,所以 Http\Server
提供的所有 API
和配置项都可以使用。
# ws_server.php
class WebSocket
{
public $server;
public function __construct()
{
// 创建websocket服务器对象,监听0.0.0.0:9502端口
$this->server = new Swoole\WebSocket\Server("0.0.0.0", 9502);
// 设置服务器运行参数
$this->server->set(array(
'daemonize' => 1, // 作为守护进程运行,需同时设置log_file
'log_file' => '/www/logs/swoole.log', // 指定标准输出和错误日志文件
));
// 监听WebSocket连接打开事件
$this->server->on('open', function ($ws, $request) {
var_dump($request->fd, $request->get, $request->server);
$ws->push($request->fd, "hello, welcome\n");
});
// 监听WebSocket消息事件
$this->server->on('message', function ($ws, $frame) {
echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
$ws->push($frame->fd, "server: {$frame->data}");
});
// 监听WebSocket连接关闭事件
$this->server->on('close', function ($ws, $fd) {
echo "client {$fd} is closed\n";
});
// 通过 HTTP 请求向所有用户推送消息
$this->server->on('request', function ($request, $response) {
foreach ($this->server->connections as $fd) {
// 检查连接是否为有效的 WebSocket 客户端连接,避免push失败
if ($this->server->isEstablished($fd)) {
$this->server->push($fd, $request->get['message']);
}
}
});
$this->server->start();
}
}
// 启动 WebSocket 服务器
new WebSocket();
运行并测试 WebSocket 异步风格服务器
# 如果程序已经运行,先结束进程
kill -9 11591
# 在 cli 命令行环境运行服务端
php ws_server.php
# 查看服务器监听的端口
netstat -an | grep 9502
WebSocket JS客户端
# index.js
var wsServer = 'ws://127.0.0.1:9502';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) {
console.log("Connected to WebSocket server.");
websocket.send('hello ws!');
};
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);
};
客户端
Chrome/Firefox/
高版本IE/Safari
等浏览器内置了JS
语言的WebSocket
客户端- 微信小程序开发框架内置的
WebSocket
客户端 - 异步 IO 的
PHP
程序中可以使用 Swoole\Coroutine\Http 作为WebSocket
客户端 Apache/PHP-FPM
或其他同步阻塞的PHP
程序中可以使用swoole/framework
提供的同步 WebSocket 客户端- 非
WebSocket
客户端不能与WebSocket
服务器通信
WebSocket 协程风格服务器
Co\run(function () {
$server = new Co\Http\Server("127.0.0.1", 9502, false);
// 设置服务器运行参数
$server->set(array(
'daemonize' => 1, // 作为守护进程运行,需同时设置log_file
'log_file' => '/www/logs/swoole.log', // 指定标准输出和错误日志文件
));
$server->handle('/websocket', function ($request, $ws) {
// 向客户端发送 WebSocket 握手消息
$ws->upgrade();
// 循环处理消息的接收和发送
while (true) {
// 接收 WebSocket 消息帧,会挂起当前协程,等待数据到来时再恢复协程的执行
$frame = $ws->recv();
if ($frame === false) {
echo "error : " . swoole_last_error() . "\n";
break;
} else if ($frame == '') {
break;
} else {
if ($frame->data == "close") {
$ws->close();
return;
}
// 向对端发送数据帧
$ws->push("Hello {$frame->data}!");
$ws->push("How are you, {$frame->data}?");
}
}
});
$server->handle('/', function ($request, $response) {
$response->end(<<<HTML
<h1>Swoole WebSocket Server</h1>
<script>
var wsServer = 'ws://127.0.0.1:9502/websocket';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) {
console.log("Connected to WebSocket server.");
websocket.send('hello');
};
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);
};
</script>
HTML
);
});
$server->start();
});
WebSocket 协程客户端
官方建议使用 Saber 。
Swoole 中使用 WebSocket 异步服务器、WebSocket 协程服务器的更多相关文章
- day37 异步回调和协程
异步回调 """ 异步任务使用场景 爬虫 1.从目标站点下载网页数据 本质就是HTML格式字符串 2.用re从字符串中提取出你需要的数据 ""&quo ...
- Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型
使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为 ...
- Python异步IO之协程(一):从yield from到async的使用
引言:协程(coroutine)是Python中一直较为难理解的知识,但其在多任务协作中体现的效率又极为的突出.众所周知,Python中执行多任务还可以通过多进程或一个进程中的多线程来执行,但两者之中 ...
- 深入浅析python中的多进程、多线程、协程
深入浅析python中的多进程.多线程.协程 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源 ...
- 进程&线程(三):外部子进程subprocess、异步IO、协程、分布式进程
1.外部子进程subprocess python之subprocess模块详解--小白博客 - 夜风2019 - 博客园 python subprocess模块 - lincappu - 博客园 之前 ...
- Swoole 中使用 TCP 异步服务器、TCP 协程服务器、TCP 同步客户端、TCP 协程客户端
TCP 异步风格服务器 异步风格服务器通过监听事件的方式来编写程序.当对应的事件发生时底层会主动回调指定的函数. 由于默认开启协程化,在回调函数内部会自动创建协程,遇到 IO 会产生协程调度,异步风格 ...
- Swoole 中使用 HTTP 异步服务器、HTTP 协程服务器
HTTP 异步风格服务器 # http_server.php $http = new Swoole\Http\Server("0.0.0.0", 9501); // 设置服务器运行 ...
- Swoole 中使用 UDP 异步服务器、UDP 同步客户端、UDP 协程客户端
UDP 异步风格服务器 # udp_server.php // 创建 UDP 服务器对象,监听0.0.0.0:9502端口,类型为SWOOLE_SOCK_UDP $serv = new Swoole\ ...
- Python 中的进程、线程、协程、同步、异步、回调
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...
随机推荐
- App内容分享
1.发送文本内容 发送简单的数据到其他应用,比如社交分分享的内容,意图允许用户快速而方便的共享信息. //分享简单的文本内容 public void btnShareText(View view) { ...
- Python实战之MySQL数据库操作
1. 要想使Python可以操作MySQL数据库,首先需要安装MySQL-python包,在CentOS上可以使用一下命令来安装 $ sudo yum install MySQL-python 2. ...
- JQuery 和 CSS 等选择器:
JQuery 选择器: CSS 选择器:
- synchronized底层浅析(二)
一张图了解锁升级流程:
- 【JavaScript】创建全0的Array
1.创建一个长度为m的全0数组 var arr = new Array(m).fill(0); 2.创建一个m行n列的全0数组 var arr = new Array(m).fill(new Arra ...
- 学习笔记--html篇(2)
html学习--2 canvas . svg 区别 canvas: 依赖分辨率 不支持文本渲染能力 文本渲染能力弱 支持保存图像为png.jpg等格式 适合图像密集开发(游戏) SVG 不依赖分辨率 ...
- antd动态的表格合并(包含排序功能)
主要是两个步骤, 1.处理接口返回数据,给其添加两个属性,一个是合并行数(列数),一个是当前数据的序号 2.在columns结合antd官网的处理方法合并表格 3.尽可能得减少计算量 数据处理函数 / ...
- set env export区别
set env export区别 set,env和export这三个命令都可以用来显示shell变量,区别[root@localhost root]# aaa=bbb[root@localhost r ...
- house of force----gyctf_2020_force!!
做这道题前线学习一下house of force的用法 Linux下堆溢出利用2-House of force基本原理_haibiandaxia的博客-CSDN博客 老样子例行检查(这里我就不放了) ...
- [BUUCTF]PWN1——test_your_nc
[BUUCTF]PWN1-test_your_nc 题目网址:https://buuoj.cn/challenges#test_your_nc 步骤: 根据题目提示,nc一下靶场 2.nc连接上后ls ...