文章目录

  • 一、引入
  • 二、工作原理
  • 三、实现
  • 四、源码剖析
  • 五、总结

一、引入

在 TCP 保持长连接的过程中,可能会出现断网等网络异常出现,异常发生的时候, client 与 server 之间如果没有交互的话,它们是无法发现对方已经掉线。

二、工作原理

在 client 与 server 之间在一定时间内没有数据交互时, 即处于 idle 状态时, 客户端或服务器就会发送一个特殊的数据包给对方, 当接收方收到这个数据报文后, 也立即发送一个特殊的数据报文, 回应发送方, 此即一个 PING-PONG 交互。所以, 当某一端收到心跳消息后, 就知道了对方仍然在线, 这就确保 TCP 连接的有效性。

TCP 实际上自带的就有长连接选项,本身是也有心跳包机制,也就是 TCP 的选项:SO_KEEPALIVE。但是,TCP 协议层面的长连接灵活性不够。所以,一般情况下我们都是在应用层协议上实现自定义心跳机制的,也就是在 Netty 层面通过编码实现。通过 Netty 实现心跳机制的话,核心类是 IdleStateHandler 。

三、实现

Netty中, 实现心跳机制的关键是 IdleStateHandler

public IdleStateHandler(int readerIdleTimeSeconds, int writerIdleTimeSeconds, int allIdleTimeSeconds) {this((long)readerIdleTimeSeconds, (long)writerIdleTimeSeconds, (long)allIdleTimeSeconds, TimeUnit.SECONDS);
}

参数的含义:

  • readerIdleTimeSeconds: 读超时. 即当在指定的时间间隔内没有从 Channel 读取到数据时, 会触发一个 READER_IDLEIdleStateEvent 事件.
  • writerIdleTimeSeconds: 写超时. 即当在指定的时间间隔内没有数据写入到 Channel 时, 会触发一个 WRITER_IDLEIdleStateEvent 事件.
  • allIdleTimeSeconds: 读/写超时. 即当在指定的时间间隔内没有读或写操作时, 会触发一个 ALL_IDLEIdleStateEvent 事件.

**注意:**这三个参数默认的时间单位是秒。

心跳处理类:ClientIdleStateTrigger

/*** <p>*  用于捕获{@link IdleState#WRITER_IDLE}事件(未在指定时间内向服务器发送数据),然后向<code>Server</code>端发送一个心跳包。* </p>*/
public class ClientIdleStateTrigger extends ChannelInboundHandlerAdapter {public static final String HEART_BEAT = "heart beat!";@Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if (evt instanceof IdleStateEvent) {IdleState state = ((IdleStateEvent) evt).state();if (state == IdleState.WRITER_IDLE) {// write heartbeat to serverctx.writeAndFlush(HEART_BEAT);}} else {super.userEventTriggered(ctx, evt);}}}

四、源码剖析

第254行代码其实表示该方法只是进行了透传,不做任何业务逻辑处理,让channelPipe中的下一个handler处理channelRead方法,但是记录了一下这里的调用时间

channelActive方法

initialize方法

这边会触发一个Task,ReaderIdleTimeoutTask,这个task是部分源码

341行是这样的,用当前时间减去最后一次channelRead方法调用的时间,假如这个结果是6s,说明最后一次调用channelRead已经是6s之前的事情了,你设置的是5s,那么nextDelay则为-1,说明超时了,那么354行则会触发userEventTriggered方法,如果没有超时则不触发userEventTriggered方法。

五、总结

IdleStateHandler这个类会根据你设置的超时参数的类型和值,循环去检测channelReadwrite方法多久没有被调用了,如果这个时间超过了你设置的值,那么就会触发对应的事件,read触发read,write触发write,all触发all

  • 如果超时了,则会调用userEventTriggered方法,且会告诉你超时的类型
  • 如果没有超时,则会循环定时检测,除非你将IdleStateHandler移除Pipeline


JVM内存泄漏和内存溢出的原因
JVM常用监控工具解释以及使用
Redis 常见面试题(一)
ClickHouse之MaterializeMySQL引擎(十)
三种实现分布式锁的实现与区别
线程池的理解以及使用

号外!号外!

最近面试BAT,整理一份面试资料,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。想获取吗?如果你想提升自己,并且想和优秀的人一起进步,感兴趣的朋友,可以在扫码关注下方公众号。资料在公众号里静静的躺着呢。。。

  • 喜欢就收藏
  • 认同就点赞
  • 支持就关注
  • 疑问就评论

一键四连,你的offer也四连

————————————————————————————————————————————————————————————————

本文作者:Java技术债务
原文链接:https://www.cuizb.top/myblog/article/1645434283
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。

Netty的心跳机制相关推荐

  1. 浅析 Netty 实现心跳机制与断线重连

    基础 何为心跳 顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可 ...

  2. 四、Netty 实现心跳机制与断线重连

    一.概述 何为心跳 顾名思义, 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不 ...

  3. Netty实现心跳机制与断线重连

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://www.jianshu.com/p/ ...

  4. 开发im即时通讯如何用Netty实现心跳机制、断线重连机制

    所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 注:心跳包还有另一个作用,经常被忽略,即:一个连接如果长时间 ...

  5. netty之心跳机制

    目录 一.前言 二.netty的心跳工具 三.IdleStatehandler 1.构造方法 2.handlerAdded 3.定时任务 4.读事件空闲 5.写事件空闲 一.前言 心跳机制就是定时的给 ...

  6. java通过netty实现心跳机制_Netty4服务端心跳机制

    Netty4与Netty3.x的心跳机制略有不同,在Netty4中已经去掉了IdleStateAwareChannelHandler这个类,但IdleStateHandler依旧保留,只是心跳超时的触 ...

  7. 这样讲 Netty 中的心跳机制,还有谁不会?

    作者:永顺 segmentfault.com/a/1190000006931568 基础 何为心跳 顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, ...

  8. Netty 中的心跳机制

    何为心跳 顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可靠性, ...

  9. 长连接 、短连接、心跳机制与断线重连

    在不同场景下要考虑长连接还是短连接,那么我们要先了解他. 短连接 概念 client与server通过三次握手建立连接,client发送请求消息,server返回响应,一次连接就完成了. 这时候双方任 ...

最新文章

  1. 2021年中国工业互联网安全大赛核能行业赛道writeup之Webshell密码
  2. OneGame V1.0.2 发布,让运营游戏不再是梦想
  3. SpringBoot 源码解析 —— SpringApplication 源码分析
  4. 如何发送html email,如何发送HTML电子邮件?
  5. FTP服务器的搭建与安全配置
  6. 清除浮动塌陷的4种经典套路
  7. 转:libev和libevent的设计差异
  8. 【转】mybatis 自增主键配置
  9. 获取屏幕的宽高 android,Android获取屏幕宽高的方法
  10. Helm 3 完整教程(九):Helm 函数讲解(3)类型转换函数、正则表达式函数
  11. 【YOLO家族】【论文翻译】YOLO v1 Unified, Real-Time Object Detection
  12. ARM寄存器的操作方法
  13. 基于Java Web的网络考试系统
  14. 倒车雷达c语言编程,基于单片机的倒车雷达设计
  15. UiPath手把手中文教程PDF
  16. 栈内存与堆内存的简单理解
  17. android圆形的ImageView
  18. 碳中和推动第四次工业革命
  19. 真香!有了这个搜索大法,GitHub玩到飞起来!
  20. 频谱分析过程中的混叠现象、栅栏现象和泄漏现象

热门文章

  1. MATLAB—取整函数汇总(fix、ceil、floor、round的用法与区别 )
  2. vue 幻灯片组件_带有vue的漂亮幻灯片组件
  3. selenium python自动化测试教程_Python selenium自动化测试模型图解
  4. PC单机游戏的复兴?
  5. 用 Axialis IconWorkshop 将ico图标转换成gif图标
  6. CIS相机在工业AOI的应用和发展
  7. CUDA C 编程权威指南 Grossman 第9章 多GPU编程
  8. 驱动LSM6DS3TR-C实现高效运动检测与数据采集(5)----姿态解算
  9. C# DateTime.Now.ToString() 用法
  10. 关于偶阶幻方双向对称填写方法的探讨