// 登錄
var login_data = JSON.stringify({"type":"login","client_name":name,"room_id":<?php echo isset($_GET) ? $_GET : 1?>});
console.log("websocket握手成功,發(fā)送登錄數(shù)據(jù):"+login_data);
ws.send(login_data);
reconnect = true;
這是chat首頁登錄的邏輯。這里我想在login_data中增加一項例如userid:12345,并用這個userid生成對應(yīng)的client_id,請問ws.send(login_data)后我該如何處理?后端如何獲取ws發(fā)送的內(nèi)容?
// 全局唯一client_id
$global_client_id = $this->createGlobalClientId();
$this->clientConnMap = $fd;
$this->connClientMap = $global_client_id;
這個是默認(rèn)的client_id生成邏輯。如何獲取ws發(fā)送的userid呢???求指導(dǎo)
登錄時想向workerman-chat傳遞任何數(shù)據(jù),在login_data加即可。
js調(diào)用 ws.send 發(fā)送的數(shù)據(jù)都在workerman/applications/Chat/Event.php中的onMessage方法里面接收,login_data也是在這里接收解析。
workerman-chat默認(rèn)沒有userid概念,全部以client_id作為客戶端標(biāo)記相互發(fā)送數(shù)據(jù)。client_id可以看做Web開發(fā)中的session_id,每個網(wǎng)頁的連接的client_id都不一樣(類似Web程序中每次用戶登錄session_id都不一樣)。
如果想讓workerman-chat中的用戶與現(xiàn)有其他項目中的用戶關(guān)聯(lián)起來,可以在workerman-chat登錄發(fā)送給workerman的login_data加入用戶識別信息(例如你說的userid,實際上這樣不安全,容易被偽造。比較安全的做法是login_data中放入登錄用戶的Web程序的session_id,workerman收到Web程序的session_id來驗證用戶,識別方法一般是Web登錄時保存session_id與用戶信息的關(guān)系),當(dāng)workerman-chat識別當(dāng)前用戶后,可以使用workerman提供的$_SESSION機(jī)制(和Web的$_SESSION類似)記錄當(dāng)前用戶用戶的信息,例如$_SESSION=xx;$_SESSION=xxx;...,當(dāng)需要當(dāng)前用戶的信息時直接從$_SESSION中取即可,非常方便。
如果想通過userid來獲得client_id,你需要一個存儲來記錄userid和client_id的對應(yīng)關(guān)系,可以限制一對一或者一對多(根據(jù)自己業(yè)務(wù)情況確定)。
GatewayWorker 增加了bindUid 和 sendToUid方法,可以直接使用,參見手冊
http://workerman.net/gatewaydoc/gateway-worker-development/bind-uid.html
http://workerman.net/gatewaydoc/gateway-worker-development/send-to-uid.html