WebSocket\Frame
在4.2.0
版本中, 新增了 服务端和客户端 发送WebSocket\Frame
对象的支持
在4.4.12
版本中,新增了flags
属性以支持WebSocket压缩帧
同时增加了一个新的子类WebSocket\CloseFrame
一个普通的frame
对象具有以下属性
object(Swoole\WebSocket\Frame)#1 (4) {
["fd"]=>
int(0)
["data"]=>
NULL
["opcode"]=>
int(1)
["finish"]=>
bool(true)
}
一个普通的close frame
对象具有以下属性, 多了code
和reason
属性, 记录了关闭的错误代码和原因
如果服务端需要接收close frame
, 需要通过$server->set
开启open_websocket_close_frame
参数
object(Swoole\WebSocket\CloseFrame)#1 (6) {
["fd"]=>
int(0)
["data"]=>
NULL
["finish"]=>
bool(true)
["opcode"]=>
int(8)
["code"]=>
int(1000)
["reason"]=>
string(0) ""
}
在用于发送时, fd
属性会被忽略(因为服务器端fd
是第一个参数, 客户端无需指定fd
), 所以fd
是一个只读属性
相关示例代码可以在 swoole websocket 单元测试 中找到
WebSocket帧压缩 (RFC-7692)
首先你需要配置'websocket_compression' => true
来启用压缩(websocket握手时将与对端交换压缩支持信息)
而后,你可以使用flag SWOOLE_WEBSOCKET_FLAG_COMPRESS
来对具体的某个帧进行压缩
示例:
服务端:
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();
客户端:
use \Swoole\Coroutine\Http\Client;
$cli = Client('127.0.0.1', 9501);
$cli->set(['websocket_compression' => true]);
$cli->upgrade('/');
$cli->push(
'Hello Swoole',
SWOOLE_WEBSOCKET_OPCODE_TEXT,
SWOOLE_WEBSOCKET_FLAG_FIN | SWOOLE_WEBSOCKET_FLAG_COMPRESS
);