Netty的心跳机制
文章目录
- 一、引入
- 二、工作原理
- 三、实现
- 四、源码剖析
- 五、总结
一、引入
在 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_IDLE
的IdleStateEvent
事件. - writerIdleTimeSeconds: 写超时. 即当在指定的时间间隔内没有数据写入到
Channel
时, 会触发一个WRITER_IDLE
的IdleStateEvent
事件. - allIdleTimeSeconds: 读/写超时. 即当在指定的时间间隔内没有读或写操作时, 会触发一个
ALL_IDLE
的IdleStateEvent
事件.
**注意:**这三个参数默认的时间单位是秒。
心跳处理类: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
这个类会根据你设置的超时参数的类型和值,循环去检测channelRead
和write
方法多久没有被调用了,如果这个时间超过了你设置的值,那么就会触发对应的事件,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的心跳机制相关推荐
- 浅析 Netty 实现心跳机制与断线重连
基础 何为心跳 顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可 ...
- 四、Netty 实现心跳机制与断线重连
一.概述 何为心跳 顾名思义, 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不 ...
- Netty实现心跳机制与断线重连
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://www.jianshu.com/p/ ...
- 开发im即时通讯如何用Netty实现心跳机制、断线重连机制
所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 注:心跳包还有另一个作用,经常被忽略,即:一个连接如果长时间 ...
- netty之心跳机制
目录 一.前言 二.netty的心跳工具 三.IdleStatehandler 1.构造方法 2.handlerAdded 3.定时任务 4.读事件空闲 5.写事件空闲 一.前言 心跳机制就是定时的给 ...
- java通过netty实现心跳机制_Netty4服务端心跳机制
Netty4与Netty3.x的心跳机制略有不同,在Netty4中已经去掉了IdleStateAwareChannelHandler这个类,但IdleStateHandler依旧保留,只是心跳超时的触 ...
- 这样讲 Netty 中的心跳机制,还有谁不会?
作者:永顺 segmentfault.com/a/1190000006931568 基础 何为心跳 顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, ...
- Netty 中的心跳机制
何为心跳 顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可靠性, ...
- 长连接 、短连接、心跳机制与断线重连
在不同场景下要考虑长连接还是短连接,那么我们要先了解他. 短连接 概念 client与server通过三次握手建立连接,client发送请求消息,server返回响应,一次连接就完成了. 这时候双方任 ...
最新文章
- 2021年中国工业互联网安全大赛核能行业赛道writeup之Webshell密码
- OneGame V1.0.2 发布,让运营游戏不再是梦想
- SpringBoot 源码解析 —— SpringApplication 源码分析
- 如何发送html email,如何发送HTML电子邮件?
- FTP服务器的搭建与安全配置
- 清除浮动塌陷的4种经典套路
- 转:libev和libevent的设计差异
- 【转】mybatis 自增主键配置
- 获取屏幕的宽高 android,Android获取屏幕宽高的方法
- Helm 3 完整教程(九):Helm 函数讲解(3)类型转换函数、正则表达式函数
- 【YOLO家族】【论文翻译】YOLO v1 Unified, Real-Time Object Detection
- ARM寄存器的操作方法
- 基于Java Web的网络考试系统
- 倒车雷达c语言编程,基于单片机的倒车雷达设计
- UiPath手把手中文教程PDF
- 栈内存与堆内存的简单理解
- android圆形的ImageView
- 碳中和推动第四次工业革命
- 真香!有了这个搜索大法,GitHub玩到飞起来!
- 频谱分析过程中的混叠现象、栅栏现象和泄漏现象
热门文章
- MATLAB—取整函数汇总(fix、ceil、floor、round的用法与区别 )
- vue 幻灯片组件_带有vue的漂亮幻灯片组件
- selenium python自动化测试教程_Python selenium自动化测试模型图解
- PC单机游戏的复兴?
- 用 Axialis IconWorkshop 将ico图标转换成gif图标
- CIS相机在工业AOI的应用和发展
- CUDA C 编程权威指南 Grossman 第9章 多GPU编程
- 驱动LSM6DS3TR-C实现高效运动检测与数据采集(5)----姿态解算
- C# DateTime.Now.ToString() 用法
- 关于偶阶幻方双向对称填写方法的探讨