当前位置: 首页 > 文档资料 > Swoole 中文文档 >

Websocket服务器

优质
小牛编辑
126浏览
2023-12-01

?> 完全协程化的Websocket服务器实现,继承自Co\Http\Server,底层提供了对WebSocket协议的支持,在此不再赘述,只说差异。

!> 此章节在v4.4.13后可用。

完整示例

Co\run(function () {
    $server = new Co\Http\Server("127.0.0.1", 9502, false);
    $server->handle('/websocket', function ($request, $ws) {
        $ws->upgrade();
        while (true) {
            $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();
});

处理流程

  • $ws->upgrade():向客户端发送WebSocket握手消息
  • while(true)循环处理消息的接收和发送
  • $ws->recv()接收WebSocket消息帧
  • $ws->push()向对端发送数据帧
  • $ws->close()关闭连接

!> $ws是一个Swoole\Http\Response对象,具体每个方法使用方法参考下文。

方法

upgrade()

发送WebSocket握手成功信息。

!> 此方法不要用于异步风格的服务器中

Swoole\Http\Response->upgrade(): bool;

recv()

接收WebSocket消息。

!> 此方法不要用于异步风格的服务器中,调用recv方法时会挂起当前协程,等待数据到来时再恢复协程的执行

Swoole\Http\Response->recv(double timeout = -1): Swoole\WebSocket\Frame | fasle | string;
  • 返回值

    • 成功收到消息,返回Swoole\WebSocket\Frame对象,请参考 WebSocket\Frame
    • 失败返回false,请使用 swoole_last_error() 获取错误码
    • 连接关闭返回空字符串

push()

发送WebSocket数据帧。

!> 此方法不要用于异步风格的服务器中,发送大数据包时,需要监听可写,因此会引起多次协程切换

Swoole\Http\Response->push(string|object $data, int $opcode = 1, bool $finish = true): bool;
  • 参数

    !> 若传入的$dataWebSocket\Frame 对象则其后续参数会被忽略,支持发送各种帧类型

    • string $data

      • 功能:要发送的内容
      • 默认值:无
      • 其它值:无
    • string $opcode

      • 功能:指定发送数据内容的格式 【默认为文本。发送二进制内容$opcode参数需要设置为WEBSOCKET_OPCODE_BINARY
      • 默认值WEBSOCKET_OPCODE_TEXT
      • 其它值WEBSOCKET_OPCODE_BINARY
    • bool $finish

      • 功能:是否发送完成
      • 默认值true
      • 其它值false

close()

关闭WebSocket连接。

!> 此方法不要用于异步风格的服务器中,在v4.4.15以前版本会误报Warning忽略即可。

Swoole\Http\Response->close(): bool;