Gateway::bindUid($client_id,$id);Gateway::sendToUid($id, json_encode($data));
sendToUid的时候要开2个页面才能收到消息,下面就以a页 b页来说吧 a页怎么刷就是没收到 推过来的消息,得再开一个页,b页
然后在a页上 刷, 可以在b页看到消息, a页就是没有消息
这么说吧: 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)); }
你的逻辑明显有问题吧,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 让客户端绑定,呀 好乱啊 应该是大佬说的 逻辑 反了 回头再研究,
这么说吧:
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
服务端
客户端
你的逻辑明显有问题吧,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 让客户端绑定,呀
好乱啊
应该是大佬说的 逻辑 反了
回头再研究,