websocket协议在onConnect时为什么不能发送数据

walkor

使用websocket协议,为什么无法在onConnect的时候发送数据?使用其它协议就可以。

7490 1 0
1个回答

walkor

websocket协议在tcp建立连接后有个握手的通讯过程,onConnect回调是在TCP建立连接后立刻被调用,如果在TCP建立连接后立刻在onConnect发送数据给客户端,会扰乱websocket握手,导致websocket握手失败。

workerman中在使用websocket协议时,有个onWebSocketConnect回调,这个回调是在websocket握手成功真正建立起websocket连接后的回调,用法如下:

Worker项目:

$ws = new Worker('websocket://0.0.0.0:12345');
// 当tcp建立连接时的回调
$ws->onConnect = function($connection)
{
    // 设置这个连接的onWebSocketConnect协议回调
    // 即websocket握手成功真正建立起websocket连接后的回调
    $connection->onWebSocketConnect = function($connection)
    {
        // 当websocket连接建立起来后,向客户端发送数据
        $connection->send("hello");
    };
};

GatewayWorker项目:
目前在GatewayWorker中不支持在Event.php设置onWebSocketConnect回调,但可以在$gateway初始化时指定$gateway的onWebSocketConnect回调,方法和上面一样。

$gateway = new Worker('websocket://0.0.0.0:12345');
$gateway->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection)
    {
        $connection->send("hello");
    };
};

GatewayWorker项目注意:
$gateway初始化的onWebSocketConnect 回调运行在Gateway进程,在onWebSocketConnect 回调中无法使用Gateway::XXX相关的接口,可以使用$connection->send()发送数据。也无法直接使用$_SESSION
onWebSocketConnect 中:
目前可以通过$connection->globalClientId 获得户端的client_id
目前可以通过unserialize($connection->session)获得当前客户端在Event::onXXX设置的$_SESSION;
目前也可以$connection->session = serialize($session_data); 设置客户端的$_SESSION,设置的session数据在Event::onXXX中可以访问到

  • 暂无评论
年代过于久远,无法发表回答
🔝