× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

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对象具有以下属性, 多了codereason属性, 记录了关闭的错误代码和原因

如果服务端需要接收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
);