WebSocket 支持

底层提供了对WebSocket协议的支持。

使用实例

go(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 {
            $ws->push("Hello {$frame->data}!");
            $ws->push("How are you, {$frame->data}?");
        }
    }
});
$server->start();
});

处理流程

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

$ws是一个Swoole\Http\Response对象,请参考 Http\Response 文档

关闭连接

由于底层持有了该连接,直接关闭会导致底层发生错误,因此未提供$ws->close()方法。应用层代码可以通过return当前WebSocket所在的handle函数,实现连接关闭。