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