国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

workerman 實(shí)現(xiàn)不同用戶推送不同消息問題

cxjphp

需求:根據(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í)例看看,謝謝!

11462 1 0
1個回答

walkor 打賞

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ù)器

  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表回答
??