请问Gate模块中如何知道客户端已经心跳超时掉线?如果自己开发这个功能有什么推荐做法
发布于 7 个月前 作者 jarekzha 588 次浏览 来自 问答

问题如题。 出发点,是想Gate发现客户端已经心跳超时掉线时,及时删除Gate上的会话信息和通知后端模块做客户端掉线的处理。

9 回复

仔细看demo里面的gate模块,有监听客户端连接和断开的接口 this.Gate.SetSessionLearner(this) //当连接建立 并且MQTT协议握手成功 func (this *Gate) Connect(session gate.Session) { log.Info(“客户端建立了链接”) }

//当连接关闭 或者客户端主动发送MQTT DisConnect命令 ,这个函数中Session无法再继续后续的设置操作,只能读取部分配置内容了 func (this *Gate) DisConnect(session gate.Session) { log.Info(“客户端断开了链接”) }

@liangdas 多谢回复! 之前注意到了DisConnect,gate中的Disconnect是用过Client.waitPack收到错误信息来判定的。我的理解上是这种方式只能响应那种TCP发了FIN或者REST包的情况。无法满足例如客户端电脑的网线被拔出这种情况。不知道我的理解是否正确。 所以我的想法是,在Gate中还是要加入对于PING的超时处理,比如3倍MinHBStorage时间间隔后都没有收到PING则调用session.Close。

@liangdas 然后目前因为不能修改gate框架源码。我现在是在StorageHandler的Storage和Heartbeat两个回调之上做了有UserId信息的session的超时处理。这种比较山寨,没办法删除没有userId的session。

gate拔网线也能检查出来,最长大概是180s左右

@liangdas 那底层是基于什么来检测的呢,具体代码在哪里呀

你看gate源码就知道了

@liangdas 看了几天还没找到,那我再继续看看吧

golalng net底层有一个超时设置,如果超过一段时间没有收到客户端的包,就会默认连接断开了

@liangdas 好的,谢谢,我仔细去看看。刚开始做go,不太熟

回到顶部