Swoole从入门到入土(17)——WebSocket服务器[成员函数与配置选项]
这一节,我们重点了解websocket server的成员函数以及相关的配置选项。
1、成员函数
push:向 WebSocket 客户端连接推送数据,长度最大不得超过 2M。
Swoole\WebSocket\Server->push(int $fd, string $data, int $opcode = WEBSOCKET_OPCODE_TEXT, bool $finish = true): bool // v4.4.12版本改为了flags参数
Swoole\WebSocket\Server->push(int $fd, string $data, int $opcode = WEBSOCKET_OPCODE_TEXT, int $flags = SWOOLE_WEBSOCKET_FLAG_FIN): bool
$fd:客户端连接的 ID 【如果指定的 $fd 对应的 TCP 连接并非 WebSocket 客户端,将会发送失败】
$data:要发送的数据内容,Swoole 版本 >= v4.2.0 传入的 $data,如果是 Swoole\WebSocket\Frame 对象则其后续参数会被忽略
$opcode:指定发送数据内容的格式 【默认为WEBSOCKET_OPCODE_TEXT。发送二进制内容 $opcode 参数需要设置为 WEBSOCKET_OPCODE_BINARY】

$finish:是否发送完成
注意:
自 v4.4.12 版本起,finish 参数(bool 型)改为 flags 参数(int 型)以支持 WebSocket 压缩,finish 对应 SWOOLE_WEBSOCKET_FLAG_FIN 值为 1,原有 bool 型值会隐式转换为 int 型,此改动向下兼容无影响。 此外压缩 flag 为 SWOOLE_WEBSOCKET_FLAG_COMPRESS。
exist:判断 WebSocket 客户端是否存在,并且状态为 Active 状态。
Swoole\WebSocket\Server->exist(int $fd): bool
返回值:连接存在,并且已完成 WebSocket 握手,返回 true;连接不存在或尚未完成握手,返回 false
注意:v4.3.0 以后,此 API 仅用于判断连接是否存在,请使用 isEstablished 判断是否为 WebSocket 连接。
pack:打包 WebSocket 消息。
Swoole\WebSocket\Server::pack(string $data, int $opcode = WEBSOCKET_OPCODE_TEXT, bool $finish = true, bool $mask = false): string // v4.4.12版本改为了flags参数
Swoole\WebSocket\Server::pack(string $data, int $opcode = WEBSOCKET_OPCODE_TEXT, int $flags = SWOOLE_WEBSOCKET_FLAG_FIN): string
$data:消息内容
$opcode:指定发送数据内容的格式 【默认为WEBSOCKET_OPCODE_TEXT。发送二进制内容 $opcode 参数需要设置为 WEBSOCKET_OPCODE_BINARY】
$finish:帧是否完成 。自 v4.4.12 版本起,finish 参数(bool 型)改为 flags 参数(int 型)以支持 WebSocket 压缩,finish 对应 SWOOLE_WEBSOCKET_FLAG_FIN 值为 1,原有 bool 型值会隐式转换为 int 型,此改动向下兼容无影响。
$mask:是否设置掩码【v4.4.12 已移除此参数】
返回值:返回打包好的 WebSocket 数据包,可通过 Swoole\Server 基类的 send() 发送给对端
$ws = new Swoole\Server('127.0.0.1', 9501 , SWOOLE_BASE);
$ws->set(array(
'log_file' => '/dev/null'
));
$ws->on('WorkerStart', function (\Swoole\Server $serv) {
});
$ws->on('receive', function ($serv, $fd, $threadId, $data) {
$sendData = "HTTP/1.1 101 Switching Protocols\r\n";
$sendData .= "Upgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: IFpdKwYy9wdo4gTldFLHFh3xQE0=\r\n";
$sendData .= "Sec-WebSocket-Version: 13\r\nServer: swoole-http-server\r\n\r\n";
$sendData .= Swoole\WebSocket\Server::pack("hello world\n");
$serv->send($fd, $sendData);
});
$ws->start();
unpack:解析 WebSocket 数据帧。
Swoole\WebSocket\Server::unpack(string $data): Swoole\WebSocket\Frame|false;
$data:消息内容
返回值:解析失败返回 false,解析成功返回 Swoole\WebSocket\Frame 对象
disconnect:主动向 WebSocket 客户端发送关闭帧并关闭该连接。
Swoole\WebSocket\Server->disconnect(int $fd, int $code = SWOOLE_WEBSOCKET_CLOSE_NORMAL, string $reason = ''): bool
$fd:客户端连接的 ID【如果指定的 $fd 对应的 TCP 连接并非 WebSocket 客户端,将会发送失败】
$code:关闭连接的状态码【根据 RFC6455,对于应用程序关闭连接状态码,取值范围为 1000 或 4000-4999 之间】
$reason:关闭连接的原因【utf-8 格式字符串,字节长度不超过 125】
返回值:发送成功返回 true,发送失败或状态码非法时返回 false
注意:Swoole 版本 >= v4.0.3 可用
isEstablished:检查连接是否为有效的 WebSocket 客户端连接。此函数与 exist 方法不同,exist 方法仅判断是否为 TCP 连接,无法判断是否为已完成握手的 WebSocket 客户端。
Swoole\WebSocket\Server->isEstablished(int $fd): bool
$fd:客户端连接的 ID【如果指定的 $fd 对应的 TCP 连接并非 WebSocket 客户端,将会发送失败】
2、配置选项
WebSocket\Server 是 Server 的子类,可以使用 Server->set() 方法传入配置选项,设置配置选项参数。
· websocket_subprotocol:设置 WebSocket 子协议。设置后握手响应的 HTTP 头会增加 Sec-WebSocket-Protocol: {$websocket_subprotocol}。
示例代码:
$server->set([
'websocket_subprotocol' => 'chat',
]);
· open_websocket_close_frame:启用 WebSocket 协议中关闭帧(opcode 为 0x08 的帧)在 onMessage 回调中接收,默认为 false。开启后,可在 Swoole\WebSocket\Server 中的 onMessage 回调中接收到客户端或服务端发送的关闭帧,开发者可自行对其进行处理。
示例代码:
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
$server->set(array("open_websocket_close_frame" => true));
$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
});
$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
if ($frame->opcode == 0x08) {
echo "Close frame received: Code {$frame->code} Reason {$frame->reason}\n";
} else {
echo "Message received: {$frame->data}\n";
}
});
$server->on('close', function ($ser, $fd) {
});
$server->start();
· open_websocket_ping_frame:启用 WebSocket 协议中 Ping 帧(opcode 为 0x09 的帧)在 onMessage 回调中接收,默认为 false。开启后,可在 Swoole\WebSocket\Server 中的 onMessage 回调中接收到客户端或服务端发送的 Ping 帧,开发者可自行对其进行处理。值为 false 时底层会自动回复 Pong 帧,但如果设为 true 后则需要开发者自行回复 Pong 帧。Swoole 版本 >= v4.5.4 可用。
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
$server->set(array("open_websocket_ping_frame" => true));
$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
});
$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
if ($frame->opcode == 0x09) {
echo "Ping frame received: Code {$frame->opcode}\n";
// 回复 Pong 帧
$pongFrame = new Swoole\WebSocket\Frame;
$pongFrame->opcode = WEBSOCKET_OPCODE_PONG;
$server->push($frame->fd, $pongFrame);
} else {
echo "Message received: {$frame->data}\n";
}
});
$server->on('close', function ($ser, $fd) {
});
$server->start();
· open_websocket_pong_frame:启用 WebSocket 协议中 Pong 帧(opcode 为 0x0A 的帧)在 onMessage 回调中接收,默认为 false。开启后,可在 Swoole\WebSocket\Server 中的 onMessage 回调中接收到客户端或服务端发送的 Pong 帧,开发者可自行对其进行处理。Swoole 版本 >= v4.5.4 可用
示例代码:
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
$server->set(array("open_websocket_pong_frame" => true));
$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
});
$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
if ($frame->opcode == 0xa) {
echo "Pong frame received: Code {$frame->opcode}\n";
} else {
echo "Message received: {$frame->data}\n";
}
});
$server->on('close', function ($ser, $fd) {
});
$server->start();
· websocket_compression:启用数据压缩。为 true 时允许对帧进行 zlib 压缩,具体是否能够压缩取决于客户端是否能够处理压缩(根据握手信息决定,参见 RFC-7692) 需要配合 flags 参数 SWOOLE_WEBSOCKET_FLAG_COMPRESS 来真正地对具体的某个帧进行压缩。Swoole 版本 >= v4.4.12 可用
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server; $server = new Server('127.0.0.1', 9501);
$server->set(['websocket_compression' => true]);
$server->on('message', function (Server $server, Frame $frame) {
$server->push(
$frame->fd,
'Hello Swoole',
SWOOLE_WEBSOCKET_OPCODE_TEXT,
SWOOLE_WEBSOCKET_FLAG_FIN | SWOOLE_WEBSOCKET_FLAG_COMPRESS
);
// $server->push($frame->fd, $frame); // 或者 服务端可以直接原封不动转发客户端的帧对象
});
$server->start();
--------------------------- 我是可爱的分割线 ----------------------------
最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧
设置 WebSocket 子协议。
Swoole从入门到入土(17)——WebSocket服务器[成员函数与配置选项]的更多相关文章
- Item 17: 理解特殊成员函数的生成规则
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 C++的官方说法中,特殊成员函数是C++愿意去主动生成的.C++9 ...
- Swoole学习(五)Swoole之简单WebSocket服务器的创建
环境:Centos6.4,PHP环境:PHP7 服务端代码 <?php //创建websocket服务器 $host = '0.0.0.0'; $port = ; $ws = new swool ...
- swoole创建websocket服务器
目录 1 安装准备 1.1 安装swoole前必须保证系统已经安装了下列软件 1.2 下载并解压 1.3 编译安装成功后,修改php.ini 2 构建Swoole基本实例 2.1 tcp服务器实例 2 ...
- 04.swoole学习笔记--webSocket服务器
<?php //创建webSocket服务器 $serv=); //获取请求 //on //open 建立连接 $serv:服务器 $request:客户端信息 $serv->on('op ...
- Erlang cowboy websocket 服务器
Erlang cowboy websocket 服务器 原文见于: http://marcelog.github.io/articles/erlang_websocket_server_cowboy_ ...
- 如何用Baas快速在腾讯云上开发小程序-系列1:搭建API & WEB WebSocket 服务器
版权声明:本文由贺嘉 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/221059001487422606 来源:腾云阁 h ...
- 用C语言实现websocket服务器
Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成,我去研究如何用c语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的 ...
- RocketMQ入门到入土(二)事务消息&顺序消息
接上一篇:RocketMQ入门到入土(一)新手也能看懂的原理和实战! 一.事务消息的由来 1.案例 引用官方的购物案例: 小明购买一个100元的东西,账户扣款100元的同时需要保证在下游的积分系统给小 ...
- netty系列之:使用netty搭建websocket服务器
目录 简介 netty中的websocket websocket的版本 FrameDecoder和FrameEncoder WebSocketServerHandshaker WebSocketFra ...
- WebSocket服务器
//创建websocket 服务器 ws_server.php //https://wiki.swoole.com/wiki/page/479.html //创建websocket服务器对象,监听0 ...
随机推荐
- Chrome显示和更改显示网页字符集的方法
Chrome显示和更改显示网页字符集的方法 背景 前段时间学习和总结了unicode和utf8的一些知识. 当时想到应该学习和整理一下网站网页的编码格式字符集相关的内容 想着既然给自己立了flag, ...
- [转帖]SQL Server 2008~2022版本序列号/密钥/激活码 汇总
https://www.cnblogs.com/cqpanda/p/16148822.html SQL Server 2022# Enterprise: J4V48-P8MM4-9N3J9-HD97X ...
- [转帖]ls 只显示目录
https://www.cnblogs.com/lavin/p/5912369.html 只显示目录: ls -d */ 在实际应用中,我们有时需要仅列出目录,下面是 4 种不同的方法. 1. 利用 ...
- [转帖]AlertManager 配置邮箱告警
http://www.mydlq.club/article/126/ 2022-12-02 13:17:00KUBERNETESPROMETHEUSALERTMANAGER 文章目录 一.邮箱告警说明 ...
- Jmeter学习之四_kingbaseV8R6数据库的简单验证
Jmeter学习之四_kingbaseV8R6数据库的简单验证 背景 周一没去报道, 因为我忘记体检了... 继续在家进行学习提高自己. jmeter周末时开始看的. 今天想着继续研究一下对数据库的处 ...
- [转帖] 如何kill一条TCP连接?
https://www.cnblogs.com/codelogs/p/16838850.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 如果你的程序写 ...
- [转帖]大模型训练,英伟达Turing、Ampere和Hopper算力分析
https://www.eet-china.com/mp/a219195.html 大 GPU 优势在于通过并行计算实现大量重复性计算.GPGPU即通用GPU,能够帮助 CPU 进行非图形相关程序的运 ...
- 一次典型的Memroy Leak的跟踪学习过程
背景 周四时某项目在QQ群里说自己的系统出现了CPU占用较高的情况. TOP 查看发现大部分占用CPU的都是 JAVA核心进城后附近的进程. 所以初步怀疑 是出现了FullGC的问题. 然后群里反馈了 ...
- Python设计模式:你的代码真的够优雅吗?
当涉及到代码优化时,Python作为一种高级编程语言,具有广泛的应用领域和强大的功能.在软件开发中,设计模式是一种被广泛采用的解决问题的方案,它提供了一种在特定情境中重复使用的可行方案.在Python ...
- web开发的模式的介绍与身份认证
web开发的模式的介绍 1.服务端渲染 2.前端端分离开发的web模式 服务端渲染优点与缺点 优点: 1.前端耗时少.因为服务器端负责动态生成HTML内容,浏览器只需要直接渲染页面即可.尤其是移动端更 ...