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

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

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中可以访问到

要回复问题请先登录注册