使用websocket协议,为什么无法在onConnect的时候发送数据?使用其它协议就可以。
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中可以访问到
GatewayWorker
$gateway
onWebSocketConnect
Gateway
Gateway::XXX
$connection->send()
$_SESSION
$connection->globalClientId
client_id
unserialize($connection->session)
Event::onXXX
$_SESSION;
$connection->session = serialize($session_data);
websocket协议在tcp建立连接后有个握手的通讯过程,onConnect回调是在TCP建立连接后立刻被调用,如果在TCP建立连接后立刻在onConnect发送数据给客户端,会扰乱websocket握手,导致websocket握手失败。
workerman中在使用websocket协议时,有个onWebSocketConnect回调,这个回调是在websocket握手成功真正建立起websocket连接后的回调,用法如下:
Worker项目:
GatewayWorker项目:
目前在GatewayWorker中不支持在Event.php设置onWebSocketConnect回调,但可以在$gateway初始化时指定$gateway的onWebSocketConnect回调,方法和上面一样。
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
中可以访问到