Gateway

Gateway

84 人关注该话题

急 thinkphp 使用gatewayclient 无法连接服务器 thinkphp Gateway

GatewayWorker walkor 回复了问题 • 4 人关注 • 6 个回复 • 369 次浏览 • 2018-08-29 14:23

GatewayWorker 中如何 给作为客户端的AsyncTcpConnection 发送信息 Gateway

GatewayWorker tufei 回复了问题 • 1 人关注 • 1 个回复 • 75 次浏览 • 2018-08-08 10:33

同一个用户登录不同设备,如何区分是移动端还是手机端 Gateway

GatewayWorker wesley_li 回复了问题 • 2 人关注 • 2 个回复 • 328 次浏览 • 2018-07-17 10:54

gateway总是在发送数据给客户端后tcp状态位发送FIN断开连接。 tcp Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 124 次浏览 • 2018-06-19 16:33

gatewayworker 有时候不进入worker Gateway

GatewayWorker six 回复了问题 • 2 人关注 • 1 个回复 • 125 次浏览 • 2018-06-11 10:22

GateWay怎么使用证书。,用的text协议 ssl加密 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 172 次浏览 • 2018-06-04 04:33

stream_socket_sendto(): Զ�����ǿ�ȹر��һ�����е���ӡ� thinkphp Gateway

GatewayWorker bianchao1 回复了问题 • 6 人关注 • 6 个回复 • 891 次浏览 • 2018-05-29 15:19

Apache 反向代理 GatewayWorker 失败 Gateway ssl加密

GatewayWorker maq 回复了问题 • 2 人关注 • 2 个回复 • 117 次浏览 • 2018-05-16 18:37

GatewayWorker中client_id和uid之间的关系 Gateway

GatewayWorker walkor 回复了问题 • 5 人关注 • 4 个回复 • 2162 次浏览 • 2018-05-07 10:18

心跳包设置pingNotResponseLimit后,客户端会断开 心跳 Gateway

GatewayWorker walkor 回复了问题 • 4 人关注 • 4 个回复 • 905 次浏览 • 2018-04-27 14:38

20多个终端连接服务器后,服务器会出现延迟,终端断开后还会继续接收数据 Gateway

GatewayWorker six 回复了问题 • 2 人关注 • 1 个回复 • 230 次浏览 • 2018-04-24 18:58

服务器通过tcp长连接接收数据 Gateway

GatewayWorker zhengweipx 回复了问题 • 2 人关注 • 2 个回复 • 369 次浏览 • 2018-04-24 14:15

start_gateway.php里可以获取client_id吗? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 182 次浏览 • 2018-04-13 13:58

如何在onWebSocketConnect回调中,获取client_id? client_id Gateway

GatewayWorker JoeZing 回复了问题 • 2 人关注 • 4 个回复 • 708 次浏览 • 2018-04-12 14:48

分布式问题求助 Gateway 分布式

GatewayWorker walkor 回复了问题 • 3 人关注 • 2 个回复 • 246 次浏览 • 2018-04-07 14:48

gateway,无法查看status,显示not run。 Gateway

GatewayWorker banice 回复了问题 • 1 人关注 • 1 个回复 • 271 次浏览 • 2017-12-18 08:49

GatewayWorker报错SendBufferToWorker fail. May be the send buffer are overflow Gateway

GatewayWorker mingjian 回复了问题 • 2 人关注 • 2 个回复 • 395 次浏览 • 2017-12-15 15:40

GatewayWorker集群,Woker服务器产生大量TIME_WAIT? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 3 个回复 • 467 次浏览 • 2017-11-28 14:12

event-loop的区别? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 415 次浏览 • 2017-08-21 17:53

registerAddress端口号串了? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 256 次浏览 • 2017-08-03 10:59

如何在同个项目往多个不通的$registerAddress发送消息? Gateway

GatewayWorker walkor 回复了问题 • 3 人关注 • 1 个回复 • 323 次浏览 • 2017-07-21 10:16

Gateway,连接Redis写入,客户端多的情况下,是否会出现redis大量连接不上的可能性? redis Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 956 次浏览 • 2017-06-28 16:03

请问如何在gateway中的onConnect或onWebSocketConnect中获取client_id? Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 377 次浏览 • 2017-06-24 21:55

如果有效的实时获得Gateway中的session,特别是当上万台设备连接的时候? session Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 736 次浏览 • 2017-06-20 20:45

Gateway进程中的connections数一直在上涨,但实际上没有新的客户端加进来。 Gateway

GatewayWorker xinxing 回复了问题 • 5 人关注 • 3 个回复 • 817 次浏览 • 2017-06-07 19:56

如何在多个GatewayWorker间互发消息? 消息队列 Gateway

GatewayWorker walkor 回复了问题 • 4 人关注 • 4 个回复 • 1082 次浏览 • 2017-05-26 15:35

最新版的为什么没有生成workerman.log和pid文件?? Gateway

GatewayWorker damao 回复了问题 • 2 人关注 • 2 个回复 • 456 次浏览 • 2017-05-23 14:24

Gateway 配置ssl ssl加密 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 3 个回复 • 612 次浏览 • 2017-05-02 11:11

哪位朋友有 GatewayWorker 2.0.7版本的源码 Gateway

GatewayWorker tshanchuan 回复了问题 • 1 人关注 • 1 个回复 • 325 次浏览 • 2017-04-05 12:46

Gateway为什么只有一个客户端连接的情况下connections不止一个 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 998 次浏览 • 2017-02-09 22:48

GatewayClient调用失败 其它项目中推送 Gateway

GatewayWorker sharf 回复了问题 • 5 人关注 • 10 个回复 • 2922 次浏览 • 2017-01-27 00:15

多个Application的情况下,如何关闭或重启其中某一个App Gateway

GatewayWorker huxu1120 回复了问题 • 3 人关注 • 2 个回复 • 495 次浏览 • 2017-01-19 10:19

请问下异步Mysql组件适用于GatewayWorker吗? mysql Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 672 次浏览 • 2017-01-18 15:26

为什么Gateway会主动关闭客户端? 心跳 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 7 个回复 • 1274 次浏览 • 2017-01-07 22:31

GatewayWorker如何单开一个进程 Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 679 次浏览 • 2017-01-03 18:26

GatewayWorker中在Events文件的onMessage中require_once引入的文件更改后reload没有加载 reload Gateway

GatewayWorker walkor 回复了问题 • 2 人关注 • 1 个回复 • 779 次浏览 • 2016-11-28 14:54

请问,前端js用ws.send(data) 发送json数据,不需要进行加密吗? Gateway ssl加密

workerman-chat聊天室 damao 回复了问题 • 2 人关注 • 1 个回复 • 1769 次浏览 • 2016-08-17 09:50

更多...
0

赞同来自:

实际上GatewayWorker 2.1.4之前的版本是支持自定义client_id的,但是出现了很多问题,后来改成不可自定义,并且全局自增。

client_id 用来全局标记一个socket连接,是一个全局自增的数值,由此可以精确控制向哪个socket连接... 显示全部 »
实际上GatewayWorker 2.1.4之前的版本是支持自定义client_id的,但是出现了很多问题,后来改成不可自定义,并且全局自增。

client_id 用来全局标记一个socket连接,是一个全局自增的数值,由此可以精确控制向哪个socket连接发送数据,由于client_id自增,即使向过期的client_id发送数据不会造成影响。

client_id交给开发者自定义,难免会导致client_id重复,而client_id重复,会导致部分socket失效或者断开,也无法确定向哪个socket连接发送数据,导致应用异常,而这样的异常很难排查。

**一般开发者会想把client_id定义为uid,这样会导致业务处理困难或者业务异常。**举几个例子
1、聊天客户端与wm(GatewayWorker)建立连接,这时客户端突然断网然后重新发起一个连接,而在wm这边由于客户端异常断网,没立即收到连接断开的fin包,wm这边就有两个uid的连接,当wm终于检测到第一个连接断开时,会触发onClose($uid),这时可能会认为uid下线了,做一些下线处理操作,但是实际上这个uid还有一个连接,并没有下线,导致业务异常。

2、如果把client_id定义为uid,假设用户打开了两个socket连接,那么会导致其中的一个连接失效,无法收到数据,典型的例子是两个聊天室的连接id都是uid,则只有一个聊天室能收到消息,另外一个收不到消息,或者可能在这个聊天室给uid发送消息,但是另外一个聊天室也收到了。同样如果这个用户退出了其中的一个聊天室,onClose($uid)只能知道这个uid退出了,但是不知道退出的是哪个聊天室,导致业务编程困难。

3、如果把client_id定义为uid,无法实现多客户端通讯,像PC QQ 和手机QQ同时在线是需要两条socket连接的,必须需要分开标记的,如果都统一用uid,则无法针对某个客户端推送消息,也无法方便的判断消息是从哪个平台的客户端发来的。

**即使不用uid标记client_id**
如果client_id自定义不当,会引发逻辑错误,比如用户A上线后client_id为1,这时要向client_id为1的的连接发送数据,恰巧A用户还没收到数据就下线了,B用户上线,也被分配client_id=1,则会导致发给A用户的数据却发给了B,导致业务异常

**结论**
client_id为自增并且短时间内不重复是非常必要的,而达到这点的client_id的值对于开发者来说也没有什么意义,反而交给开发者定义会出现很多不可预知的问题,并且很难排查。

关于和现有账号绑定问题,GatewayWorker后面会考虑增加一组接口,用来绑定uid与client_id的关系,在client_id下线时自动解绑,绑定关系存储在Gateway的内存中,不用读存储,效率很高。接口类似如下:
{{{
Gateway::bindUid($client_id, $uid); // 将$client_id绑定到uid下,uid与client_id是一对多关系
Gateway:;sendToUid($msg, $uid); // 给这个uid下的所有链接发送数据
}}}
0

赞同来自:

说明:
array Gateway::getClientIdByUid(mixed $uid);
返回一个数组,数组元素为与uid绑定的所有在线的client_id。如果没有在线的client_id则返回一个空数组。

此方法可以判断一个uid是否在线。

注... 显示全部 »
说明:
array Gateway::getClientIdByUid(mixed $uid);
返回一个数组,数组元素为与uid绑定的所有在线的client_id。如果没有在线的client_id则返回一个空数组。

此方法可以判断一个uid是否在线。

注意:返回值为与uid绑定的所有在线的client_id数组。因为已经下线的client_id会自动与uid解绑,所以已经下线的client_id不会出现在返回值中。

见手册
http://workerman.net/gatewaydoc/gateway-worker-development/get-client-id-by-uid.html
1

赞同来自: kaifengjk

**两个方法的作用**
Gateway::sendToGroup是给某个用户组(这里是房间)的用户连接发送数据
Gateway::sendToCurrentClient是给当前用户连接发送数据。

**用户登录数据交互流程**
1、先给当前房间所有在线用户广播... 显示全部 »
**两个方法的作用**
Gateway::sendToGroup是给某个用户组(这里是房间)的用户连接发送数据
Gateway::sendToCurrentClient是给当前用户连接发送数据。

**用户登录数据交互流程**
1、先给当前房间所有在线用户广播(Gateway::sendToGroup)有人登录,浏览器收到login数据后将**新用户**展示到在线列表里面
2、给当前登录的用户单独放送(Gateway::sendToCurrentClient)在房间的**线用户列表**

**为什么当前用户要单独发送?**
因为当前用户有个在线用户列表数据。而这个在线列表数据根本不需要发送给其它已经在线的用户,因为他们已经有了这份在线列表数据,只需要增量添加新用户即可。

**在线用户列表占用的带宽**
在线用户列表数据可能会很大。例如2000人在线,每个用户记录大概50字节,那么这个列表体积可能在100KB左右。

如果这100KB数据广播给所有2000在线用户,那么将占用带宽2000*100KB=200MB=1.6Gbit,没错,需要1.6G的带宽。。。

如果是无差别的实时广播所有在线用户,2000人的聊天室每秒一次的用户登录/退出就轻松把带宽耗光了。

**结论**
所以只给当前用户发送所有的在线用户列表,其他已经在线的用户只需要更新那一个上线的用户数据。
这就是为什么要分别发送。
更多...