默认

跟着源码学IM(五):正确理解IM长连接、心跳及重连机制,并动手实现

查看数: 249694 | 评论数: 17 | 收藏 18
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-10-21 17:05

正文摘要:

本文由原作者“crossoverJie(陈杰)”原创分享,即时通讯网收录时有改动和修订,感谢原作者。 0、系列文章 《跟着源码学IM(一):手把手教你用Netty实现心跳机制、断线重连机制》《跟着源码学IM(二):自已开发IM很 ...

评论

JackJiang 发表于 4 个月前
引用:yezipi 发表于 2025-12-12 17:11
client 如果是web 或者 electron  这种的 通过websocket 协议去链接
当服务器down掉后,websocket 就直 ...

心跳检测,一旦不通了就发起重新连接
yezipi 发表于 4 个月前
引用:JackJiang 发表于 2025-12-11 17:20
websocket的本质是tcp协议,你说的具体是指它不存什么问题?

client 如果是web 或者 electron  这种的 通过websocket 协议去链接
当服务器down掉后,websocket 就直接断开了,其实client端只要不断地定时的去重连就可以了吧。
JackJiang 发表于 4 个月前
引用:yezipi 发表于 2025-12-11 17:13
如果client 和 server 用的是websocket 协议的话 应该不存在这个问题吧
服务端down掉  websocket  链接就 ...

websocket的本质是tcp协议,你说的具体是指它不存什么问题?
yezipi 发表于 4 个月前
如果client 和 server 用的是websocket 协议的话 应该不存在这个问题吧
服务端down掉  websocket  链接就直接断了(不考虑集群的情况下)
52imuser 发表于 2 年前
不错不错,学习第四天
JackJiang 发表于 2 年前
引用:jungle1992 发表于 2023-07-05 15:50
但一旦间隔许久没有收到服务端响应进行重连的逻辑应当写在哪里呢?
当收到服务端响应的 pong 消息时,就在 ...

你要么直接去读MobileIMSDK的开源代码:https://github.com/JackJiang2011/MobileIMSDK ,它里面有完整的实现。
jungle1992 发表于 2 年前
但一旦间隔许久没有收到服务端响应进行重连的逻辑应当写在哪里呢?
当收到服务端响应的 pong 消息时,就在当前 Channel 上记录一个时间,也就是说后续可以在定时任务中取出这个时间和当前时间的差额来判断是否超过阈值。
这部分代码 看的迷迷糊糊的  按照文章中的写法 没效果啊
小农之子 发表于 4 年前
感谢分享
庞衍楠 发表于 4 年前
感谢分享
tigase 发表于 5 年前
thanks all
poiupoiu 发表于 6 年前
谢谢分享
天猫精灵 发表于 6 年前
楼主造诣精深,佩服
mustang2247 发表于 6 年前
xchao263 发表于 6 年前
引用:JackJiang 发表于 2019-11-20 14:58
说了好大一段,一句话总结,你是想说啥?

我原想说的是
1)接收到 channelInActive 事件的客户端,channelInActive 只会执行一次,但文中方案中 scheduledExecutorService.scheduleAtFixedRate(ReConnectJob,0,10,TimeUnit.SECONDS) 这个 job 会重复执行,也即“重连”,当重连成功后,会有一个新的客户端,而上述的 ReConnectJob 会【重复】执行。
---- 经查看该项目代码,有对 channel != null && channel.isActive() 的判断,当满足条件时,会退出该函数。
---- 客户端的 channelInActive 每执行一次,scheduledExecutorService 中会多一个 定时执行的 ReConnectJob,

2)即使在该代码中,当服务端多次断开时,客户端的 channelInActive 也会触发多次,也会有 多个 job 实例添加到 scheduledExecutorService  中定时执行。

JackJiang 发表于 6 年前
引用:xchao263 发表于 2019-11-20 14:14
服务端挂掉或重启后,导致客户端需要“重连”问题,客户端 ChannelHandlerContext 客户的 IdleStateHandler ...

说了好大一段,一句话总结,你是想说啥?
xchao263 发表于 6 年前
服务端挂掉或重启后,导致客户端需要“重连”问题,客户端 ChannelHandlerContext 客户的 IdleStateHandler 执行 channelInActive 是没问题的,因为服务端挂掉或关闭,对于此条客户端-服务端的链接就表示是“关闭”了,基于 netty 相关的技术链,相关的"事件"被触发。
此时执行重连,如果是能够连接上,此次的 ChannelHandlerContext 应该不是当前这个,而是一个新的,
示例代码中并没有看到 cimClient.reconnec() 连接成功明细及连接成功后的  channel 与当前这个 channel 的关联关联。
然后实际上 重连后的 channel 应该是一个全新的 channel,与当前这个并没有什么关系。
yyywww 发表于 6 年前
好,不错

返回顶部