【已解决】使用GatewayClientGateway类,客户端无法接收到消息

Jin

bug描述

在第一个项目使用 GatewayWorker\Lib\Gateway搭起了环境,可以正常运行,客户端可以正常连接,sendToClient 方法也可以正常发送指令给指定的客户端。

在第二个项目中,使用 GatewayClient\Gateway 连接第一个项目,是正常的,可以通过getClientIdByUid 获取到第一个项目里边的在线客户端的$client_id,但是调用sendToClient发送消息给指定客户端的时候,客户端一直接收不到消息。

一开始我以为在第二个项目中使用 GatewayClient\Gateway这个类不对,但是调用GatewayWorker\Lib\Gateway这个类,同样也无法发送消息给客户端。

程序代码或配置

第二个项目中
use GatewayClient\Gateway;
//这里获取是正常的,可以得到对应code绑定的client_id
$client_ids = Gateway::getClientIdByUid($data['code']);
//打印client_ids[0],是有值的
//就是执行sendToClient这里,消息发不出去,客户端接收不到
Gateway::sendToClient(
    $client_ids[0],
    json_encode($resData)
);

期待的结果及实际结果

我想知道第二个项目中通过$uid获取到$client_id后,不可以直接使用sendToClient发送给客户端吗?

系统环境及workerman/webman等具体版本

"workerman/gateway-worker": "^4.0",
"workerman/gatewayclient": "^3.0",
"workerman/workerman": "^4.1"

813 2 0
2个回答

Gin

GatewayClient\Gateway;
先执行
Gateway::$registerAddress = '127.0.0.1:1680(项目一的gateway端口)';
然后执行
Gateway::getClientIdByUid
Gateway::sendToClient

  • Jin 2023-01-04

    不是这个问题,已经解决了,感谢!

Jin

找到问题所在了,uid和client_id是一对多的关系。
如果客户端断线重连更换了client_id,那么sendToClient通过client_id发消息给客户端的时候,可能会找不到对应的客户端。之前是有的时候可以接收到,有时候接收不到。

我换成sendToUid通过uid发给客户端的时候,是可以接收到消息的。
uid和client_id的关系,手册有说明。
https://www.workerman.net/doc/gateway-worker/bind-uid.html

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