netty 中的心跳检测机制
为什么要心跳检测机制
当服务端接收到客户端的连接以后,与客户端建立 NioSocketChannel 数据传输的双工通道,但是如果连接建立以后,客户端一直不给服务端发送消息,这种情况下是占用了资源,属于空闲连接,服务端有权将其关闭掉。
不过有时候,客户端的用户可能是临时离开一会,当超过服务端限制的时间后,服务端将其关闭,这样也不够友好,因此需要建立客户端与服务端之间的心跳机制。
服务端-检测客户端是否属于空闲连接
当服务端 60s 没有接收到客户端发送的读事件,就触发 chatServerChannelDuplexHandler 中的 userEventTriggered 方法。
ch.pipeline().addLast(new IdleStateHandler(60, 0, 0, TimeUnit.SECONDS));
ch.pipeline().addLast(chatServerChannelDuplexHandler);
第一个 空闲连接状态检测 handler 参数解释
- 多长时间没有触发读事件
- 多长时间没有触发写事件
- 多长时间没有触发读写事件
- 时间单位
如果填 0,则不触发该事件
第二个 handler,自定义的处理入站出站的 handler,继承了 ChannelDuplexHandler,能处理入站出站操作,实现 userEventTriggered 方法,在读写事件触发时,会调用这个方法。这里需要判断一下被触发的事件,因为这里是一个出入站都能接收的事件方法,存在读或写事件。如果是读事件超过 60s 没有被触发,则关闭与客户端的连接。
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if (evt instanceof IdleStateEvent) {IdleStateEvent event = (IdleStateEvent) evt;if (IdleState.READER_IDLE == event.state()) {ctx.channel().close();}} else {super.userEventTriggered(ctx, evt);}
}
注意:自定义事件触发方法的 handler 必须在 IdleStateHandler 之后添加到 pipeline 中,否则该 handler 中的 userEventTriggered 不会执行,因为在翻看源码的时候,会将事件的处理转给 pipline 中的下一个 handler,如果该 handler 在 IdleStateHandler 添加之前添加,就无法找到,就不会执行。
protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) throws Exception {ctx.fireUserEventTriggered(evt);
}
ctx.fireUserEventTriggered:将当前事件转给下一个 handler 的 userEventTriggered 方法。
客户端-给服务端发送心跳包
方法跟服务端检测客户端是否读事件发生差不多。
30s 没有发生写事件时,触发事件方法,像客户端传输一个心跳数据,当服务端感知到读事件发生,60s以后就不会断开与客户端之间的连接。
为啥设置 30s,是因为一般客户端发送心跳包的时间是服务端检测时间的 1/2。
ch.pipeline().addLast(new IdleStateHandler(0, 30, 0));
ch.pipeline().addLast(new ChatClientChannelDuplexHandler());
客户端给服务端发送心跳数据
这里的 handler 也是出入站都会触发,因此事件方法中需要判断是否属于写事件,才会给服务端发送心跳数据。
@Slf4j
@ChannelHandler.Sharable
public class ChatClientChannelDuplexHandler extends ChannelDuplexHandler {@Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if (evt instanceof IdleStateEvent) {IdleStateEvent idleStateEvent = (IdleStateEvent) evt;if (IdleState.WRITER_IDLE.equals(idleStateEvent.state())) {ctx.writeAndFlush(new PingRequestMessage());}} else {super.userEventTriggered(ctx, evt);}}
}
个人理解,如有错误,欢迎大家指出纠正~
netty 中的心跳检测机制相关推荐
- Netty(八) Netty心跳检测机制
1.什么是长链接和短链接 在HTTP/1.0中默认使用短连接.也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接.当客户端浏览器访问的某个HTML或其他类型的Web页中 ...
- Netty心跳检测机制
一.Netty心跳检测机制 心跳:即在 TCP 长连接中,客户端和服务器之间定期发送的一种特殊的数据包,通知对方自己还在线,以确保 TCP 连接的有效性. 在 Netty 中,实现心跳机制的关键是 I ...
- netty的编解码、粘包拆包问题、心跳检测机制原理
文章目录 1. 编码解码器 2. 编解码序列化机制的性能优化 3. Netty粘包拆包 4. Netty心跳检测机制 5. Netty断线自动重连实现 1. 编码解码器 当你通过netty发送或者接受 ...
- Netty空闲心跳检测机制
概述 Netty提供了一个读写空闲心跳检测机制的Handler,用于检测读空闲.写空闲.读写空闲. 如果服务端在一定时间内没有执行读请求,就会触发读空闲事件,一定时间内没有执行写请求,就会触发写空闲事 ...
- 这样讲 Netty 中的心跳机制,还有谁不会?
作者:永顺 segmentfault.com/a/1190000006931568 基础 何为心跳 顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, ...
- Netty -Netty心跳检测机制案例,Netty通过WebSocket编程实现服务器和客户端长链接
Netty心跳检测机制案例 案例要求 编写一个Netty心跳检测机制案例,当服务器超过3秒没有读时,就提示读空闲 当服务器超过5秒没有写操作时,提示写空闲 服务器超过7秒没有读或者写操作时,就提示读写 ...
- Netty学习(七):心跳检测机制
一.什么是心跳检测机制 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 心跳机制主要是客户端和服务端长时间连 ...
- Netty 中的心跳机制
何为心跳 顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可靠性, ...
- Netty教程07:心跳检测机制
需求:编写一个 Netty心跳检测机制案例, 当服务器超过3秒没有读时,就提示读空闲 当服务器超过5秒没有写操作时,就提示写空闲 实现当服务器超过7秒没有读或者写操作时,就提示读写空闲 Server ...
最新文章
- 我是如何设计 Upload 上传组件的
- app图标圆角角度_怎样使用sketch绘制标准APP图标圆角矩形背景?
- MySQL server has gone away报错原因分析及解决办法
- sql server2005 出现一个或多个参数无效
- 类属性、类方法;私有属性、公有属性;私有方法、公有方法;静态属性、静态方法;python的命名规范__xx__\__xx\_xx(自用笔记)
- (33)调试驱动程序
- CSS深入理解vertical-align和line-height的基友关系
- 第十章:在Spark集群上掌握比较重要的图操作之Computing Degree
- java找_Java基础之:查找
- Say“No”,你学会了吗?
- 设置javadoc模板
- ASCII码值转化十六进制,十进制数;十六进制字符值转十进制,ASCII码值;
- SpriteKit快速入门和新时代iOS游戏开发指南
- galerkin有限元法matlab实现,应用Matlab实现有限元分析.pdf
- 最高效“双11”背后:圆通更不一样了
- 伊利诺伊大学厄本那 香槟分校计算机科学,美国伊利诺伊大学厄本那香槟分校专业设置...
- 一文读大厂微服务水平
- java毕业设计—— 基于java+JSP+SSH的婴幼儿产品销售系统设计与实现(毕业论文+程序源码)——婴幼儿产品销售系统
- C/C++植物大战僵尸之CE找基址+修改器制作(基础版)
- 手机号码归属地查询,免费API
热门文章
- 离散数学及其应用复盘 | 第3版第5章——二元关系思维导图梳理(复习专用)
- 计算机应用基础结课考试,计算机应用基础课考试试题.doc
- 微信怎样设置群发消息?干货技巧!微信如何操作群发消息?
- JS实现网页全屏和退出
- 倩女幽魂Online 倩女助手+模块+作品【新版】
- 文本处理神器Awk语言详解
- (附源码)springboot校园疫情智慧防控微信小程序 毕业设计011133
- 翻译 | ORB-SLAM: a Versatile and Accurate Monocular SLAM System(ORB-SLAM:一种通用的(全能的)精确的单目SLAM系统)
- 李开复博士给中国大学生的四封信
- 移动硬盘数据丢失恢复教程