需求:根據(jù)client端發(fā)送的不同uid,server端推送對應(yīng)uid比較感興趣的一些話題給不同的用戶
每個client 端都有唯一一個uid發(fā)送給服務(wù)端:
ws.send(JSON.stringify({"type":"attention","uid":UID}));
此時uid=416
server端發(fā)送數(shù)據(jù)的時候:
ws.send(JSON.stringify({"type":"send","uid":"416","content":input.value}));
在onMessage中處理:
switch($message_data)
{
// 發(fā)送數(shù)據(jù)給用戶 message: {type:send, to_client_id:xx, content:xx}
case 'send':
// 向某個瀏覽器窗口發(fā)送消息
if($message_data != 'all')
{
$new_message = array(
'content'=>nl2br($message_data)
);
Gateway::sendToUid($message_data, json_encode($new_message));
}
// 向所有瀏覽器發(fā)送消息
$new_message = array(
'content'=>nl2br($message_data)
);
return Gateway::sendToAll(json_encode($new_message));
break;
case 'attention':
Gateway::bindUid($client_id,$message_data);
break;
}
在server端發(fā)送消息的時候所有client端都收不到消息,希望來個知道的人,詳細(xì)說一些或者發(fā)個實(shí)例看看,謝謝!
bindUid sendToUid 的原意是將現(xiàn)有系統(tǒng)的id 和 GatewayWorker的client_id聯(lián)系起來。
例如現(xiàn)有的商城系統(tǒng)要做一個客服系統(tǒng)(gatewayWorker做),商城系統(tǒng)有自己的id體系,每個用戶有一個uid,唯一標(biāo)記一個用戶。gatewayWorker有也有自己的id體系,也就是client_id,唯一標(biāo)記一個連接。
客服要給某個商城用戶發(fā)送消息,就需要知道這個用戶當(dāng)前的client_id是什么才能發(fā)送。
有了bindUid,將商城uid與gatewayWorker的client_id綁定,那么就可以直接調(diào)用sendToUid給商城用戶發(fā)送數(shù)據(jù)了。
client_id 與 uid的綁定在Event::onMessage中做,代碼類似
class Event
{
public static function onMessage($client_id, $message)
{
//{"type":"attention","uid":UID}
$message = json_decode($message, true);
// 先判client_id是否已經(jīng)綁定uid了,沒綁定則執(zhí)行綁定
if(!isset($_SESSION))
{
Gateway::bindUid($client_id, $message);
$_SESSION = $message;
return;
}
// 其它羅輯 例如給某個用戶發(fā)送消息 sendToUid($one_uid, 'xxxxx');
}
}
分割線
——————————————————————————————————————————
其實(shí)樓主要的是訂閱功能,其實(shí)不關(guān)心什么uid\client_id,
只關(guān)心誰訂閱了哪個主題的消息,怎么把消息發(fā)給這些訂閱者,
其實(shí)這個用bindUid就能很方便的解決。
把uid當(dāng)做主題即可,把uid當(dāng)做主題即可,把uid當(dāng)做主題即可。
bindUid的作用就是將某個client_id與某個主題綁定,
sendToUid就是給某個主題的所有訂閱者發(fā)送消息。
代碼類似這樣
class Event
{
public static function onMessage($client_id, $message)
{
// 綁定主題的格式 {"type":"attention","subject":"話題1"}
$message = json_decode($message, true);
// 先判是不是綁定話題的包
if($message == 'attention')
{
Gateway::bindUid($client_id, $message);
return;
}
// 給某個話題的所有訂閱者發(fā)送消息
// 給主題發(fā)布消息的格式 {"type":"publish","subject":"話題1", "content":"這個是消息內(nèi)容"}
Gateway::sendToUid($message, $message);
}
}
這個問題估計樓主也感興趣,如何在其它系統(tǒng)中向uid(或者說訂閱者)發(fā)消息,參見
http://doc2.workerman.net/push-in-other-project.html
使用GatewayClient,可以在任意系統(tǒng)中調(diào)用Gateway::sendToUid / Gateway::sendToClient發(fā)送數(shù)據(jù),即使是其它非workerman環(huán)境的服務(wù)器