A客户端使用sendToUid方法发送消息给B客户端(2个客户端一个是chrome,一个是Firefox),但是B客户端并没有收到A发消息的websocket请求,在A客户端发消息之前,使用isUidOnline方法检测发送的目标Uid是在线的
图1 发送消息,对方在线
我使用的是环境:
(1)docker-php7.3、docker-nginx,GatewayWorker和阿里云香港云服务器Ubuntu
(2)客户端使用的是wss协议,服务端用nginx代理wss请求
(3)使用sendToUid方法发消息的时候,后台GatewayWorker终端用的是debug模式运行,但是没有报错,当频繁使用sendToUid方法发消息的时候,终端偶尔会报错:SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready. See http://doc2.workerman.net/send-buffer-to-worker-fail.html
(4)nginx做了访问频率限制,客户端发起wss连接响应偶尔会报502错误
(5)GatewayWorker的所有源码、php、nginx都在同一台云服务器上运行
图2 客户端和云服务器成功连接并得到了服务器回复、并绑定clientID 到 Uid 成功
图3 客户端wss连接云服务器偶尔报502错误
图4 不管是没收到消息还是wss连接云服务器报502错误,GatewayWorker命令行都没有报错(debug模式)
图5 start_gateway.php和start_register.php填写的服务注册地址都完全一致
图6 由于我的云服务器用的是协议是TLS1.2,因此我只改动了GatewayWorker的核心类库源码的这个位置
图7 onWorkerStart里面未进行过任何改动,应该没有死循环之类的代码
图8 我网站域名的nginx的虚拟主机配置
图9 nginx.conf的配置
图10 云服务器防火墙
图11 云服务器安全组
图12 发送消息的关键GatewayWorker代码
问题已解决,我关掉php的调试模式之后就可以通讯了。我猜是由于偶尔报的502错误中断了wss数据的返回,不知道对不对,请大佬们赐教。