在第一个项目使用 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/gateway-worker": "^4.0",
"workerman/gatewayclient": "^3.0",
"workerman/workerman": "^4.1"
GatewayClient\Gateway;
先执行
Gateway::$registerAddress = '127.0.0.1:1680(项目一的gateway端口)';
然后执行
Gateway::getClientIdByUid
Gateway::sendToClient
不是这个问题,已经解决了,感谢!
找到问题所在了,uid和client_id是一对多的关系。
如果客户端断线重连更换了client_id,那么sendToClient通过client_id发消息给客户端的时候,可能会找不到对应的客户端。之前是有的时候可以接收到,有时候接收不到。
我换成sendToUid通过uid发给客户端的时候,是可以接收到消息的。
uid和client_id的关系,手册有说明。
https://www.workerman.net/doc/gateway-worker/bind-uid.html