遇到瓶颈了。弱弱的问下bindUid绑定后当前页面收不到消息吗

差点就信了

Gateway::bindUid($client_id,$id);Gateway::sendToUid($id, json_encode($data));

sendToUid的时候要开2个页面才能收到消息,下面就以a页 b页来说吧
a页怎么刷就是没收到 推过来的消息,得再开一个页,b页

然后在a页上 刷, 可以在b页看到消息, a页就是没有消息

 

2431 5 0
5个回答

blogdaren

这么说吧: 
1、首先题意不大明确,两个页面绑定的$id是同一个吗? 如果不是那问题就很明显了,若用sendToUid()的第一个参数必须是数组类型的目标id集合,当然可以直接使用sendToAll();
2、如果绑定的是同一个$id,这就不好说了,因为两个页面的通信细节不知道你是做了什么处理,不管怎么样,Gateway::bindUid($client_id,$id);
Gateway::sendToUid($id, json_encode($data));服务端这样的操作是没有什么问题的,即向同一个id下绑定的所有client_id 发送消息,
也就是题示的a、b两个页面对应的客户端,所以问题最有可能还是出在客户端细节处理环节上,
比如:服务端推送消息时,对应的客户端连接已经被关闭了等等。
可以在服务端调用:Gateway::getClientIdByUid(mixed $uid);检测下当前id 绑定的所有 client_id 列表。

  • 暂无评论
差点就信了

谢谢大佬回复
$id是从http的session里面存到js的,再由js发给worker绑定  可以确定id是同一个
 
通信细节我也没改过,连过滤xss 都没过滤, 直接就 
 
Gateway::sendToUid($id, json_encode($data));
 
发消息了,
 
试过您提供的  getClientIdByUid  获得到的 client_id  
 
 全部是同 一个client_id 
 
 
a页面  刷新3次

 
b页面 刷新3次

 
始终还是那样, 
 
 a页面刷新的时候 接收不到 服务端发来的消息
 
却在 b页面收到了 服务端的消息
 
也用 Gateway::isUidOnline($id);测试过 打印出的是1

  • 暂无评论
差点就信了

服务端

   public static function onConnect($client_id)
   {
       Gateway::sendToClient($client_id,json_encode());
   }   
   public static function onMessage($client_id, $message)
   {

       $message_data=json_decode($message,1);
       if (!$message_data) {
           return false;
       }

        switch ($message_data)
        {
        case 'getWebOrder':
            $id= $message_data;
            $data=;
            Gateway::sendToUid($id, json_encode($data));
        break;
        case 'bind':
            Gateway::bindUid($client_id,$message_data);
        break;
        default:
            $data=;
        }
   }

客户端

wsSend = {
    id: 1000000,// 来自http session 
    action: 'getWebOrder',
    data: $titleLong,
    };
    ws.onopen = function () {
        ws.send(JSON.stringify(wsSend));
    }; 

    if (js.type=='getWebOrder'){
            console.log(js);
    } 
     if (js.type=='init'){
           var ints={action:'bind','id':1000000}
           ws.send(JSON.stringify(ints)); 
     }
  • 暂无评论
xiuwang

你的逻辑明显有问题吧,ws.onopen的时候就发送getWebOrder类型的消息,这时候还没bind呢,所以收不到。
你应该在ws.onopen的时候先发送bind信息,之后再发送getWebOrder类型的消息。顺序都反了,怎么可能收到。
 
你要的顺序是
Gateway::bindUid($client_id,$id);
Gateway::sendToUid($id, json_encode($data));
 
但实际上你实现的顺序是
Gateway::sendToUid($id, json_encode($data));
Gateway::bindUid($client_id,$id); 
 
反了反了

  • 暂无评论
差点就信了

也许可能是吧,
 
可...我不是在回话接入的时候 要求 绑定了吗
 
onConnect 里面 下发 init 让客户端绑定,呀
 
好乱啊
 
应该是大佬说的 逻辑 反了
 
回头再研究,

  • 暂无评论
年代过于久远,无法发表回答
🔝