使用websocket協(xié)議,為什么無法在onConnect的時候發(fā)送數(shù)據(jù)?使用其它協(xié)議就可以。
websocket協(xié)議在tcp建立連接后有個握手的通訊過程,onConnect回調(diào)是在TCP建立連接后立刻被調(diào)用,如果在TCP建立連接后立刻在onConnect發(fā)送數(shù)據(jù)給客戶端,會擾亂websocket握手,導致websocket握手失敗。
workerman中在使用websocket協(xié)議時,有個onWebSocketConnect回調(diào),這個回調(diào)是在websocket握手成功真正建立起websocket連接后的回調(diào),用法如下:
Worker項目:
$ws = new Worker('websocket://0.0.0.0:12345');
// 當tcp建立連接時的回調(diào)
$ws->onConnect = function($connection)
{
// 設置這個連接的onWebSocketConnect協(xié)議回調(diào)
// 即websocket握手成功真正建立起websocket連接后的回調(diào)
$connection->onWebSocketConnect = function($connection)
{
// 當websocket連接建立起來后,向客戶端發(fā)送數(shù)據(jù)
$connection->send("hello");
};
};
GatewayWorker項目:
目前在GatewayWorker中不支持在Event.php設置onWebSocketConnect回調(diào),但可以在$gateway初始化時指定$gateway的onWebSocketConnect回調(diào),方法和上面一樣。
$gateway = new Worker('websocket://0.0.0.0:12345');
$gateway->onConnect = function($connection)
{
$connection->onWebSocketConnect = function($connection)
{
$connection->send("hello");
};
};
GatewayWorker
項目注意:
$gateway
初始化的onWebSocketConnect
回調(diào)運行在Gateway
進程,在onWebSocketConnect
回調(diào)中無法使用Gateway::XXX
相關(guān)的接口,可以使用$connection->send()
發(fā)送數(shù)據(jù)。也無法直接使用$_SESSION
。
onWebSocketConnect
中:
目前可以通過$connection->globalClientId
獲得戶端的client_id
;
目前可以通過unserialize($connection->session)
獲得當前客戶端在Event::onXXX
設置的$_SESSION;
目前也可以$connection->session = serialize($session_data);
設置客戶端的$_SESSION
,設置的session數(shù)據(jù)在Event::onXXX
中可以訪問到