为什么要心跳检测机制

当服务端接收到客户端的连接以后,与客户端建立 NioSocketChannel 数据传输的双工通道,但是如果连接建立以后,客户端一直不给服务端发送消息,这种情况下是占用了资源,属于空闲连接,服务端有权将其关闭掉。

不过有时候,客户端的用户可能是临时离开一会,当超过服务端限制的时间后,服务端将其关闭,这样也不够友好,因此需要建立客户端与服务端之间的心跳机制。

服务端-检测客户端是否属于空闲连接

当服务端 60s 没有接收到客户端发送的读事件,就触发 chatServerChannelDuplexHandler 中的 userEventTriggered 方法。

ch.pipeline().addLast(new IdleStateHandler(60, 0, 0, TimeUnit.SECONDS));
ch.pipeline().addLast(chatServerChannelDuplexHandler);

第一个 空闲连接状态检测 handler 参数解释

  1. 多长时间没有触发读事件
  2. 多长时间没有触发写事件
  3. 多长时间没有触发读写事件
  4. 时间单位

如果填 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 中的心跳检测机制相关推荐

  1. Netty(八) Netty心跳检测机制

    1.什么是长链接和短链接 在HTTP/1.0中默认使用短连接.也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接.当客户端浏览器访问的某个HTML或其他类型的Web页中 ...

  2. Netty心跳检测机制

    一.Netty心跳检测机制 心跳:即在 TCP 长连接中,客户端和服务器之间定期发送的一种特殊的数据包,通知对方自己还在线,以确保 TCP 连接的有效性. 在 Netty 中,实现心跳机制的关键是 I ...

  3. netty的编解码、粘包拆包问题、心跳检测机制原理

    文章目录 1. 编码解码器 2. 编解码序列化机制的性能优化 3. Netty粘包拆包 4. Netty心跳检测机制 5. Netty断线自动重连实现 1. 编码解码器 当你通过netty发送或者接受 ...

  4. Netty空闲心跳检测机制

    概述 Netty提供了一个读写空闲心跳检测机制的Handler,用于检测读空闲.写空闲.读写空闲. 如果服务端在一定时间内没有执行读请求,就会触发读空闲事件,一定时间内没有执行写请求,就会触发写空闲事 ...

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

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

  6. Netty -Netty心跳检测机制案例,Netty通过WebSocket编程实现服务器和客户端长链接

    Netty心跳检测机制案例 案例要求 编写一个Netty心跳检测机制案例,当服务器超过3秒没有读时,就提示读空闲 当服务器超过5秒没有写操作时,提示写空闲 服务器超过7秒没有读或者写操作时,就提示读写 ...

  7. Netty学习(七):心跳检测机制

    一.什么是心跳检测机制 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 心跳机制主要是客户端和服务端长时间连 ...

  8. Netty 中的心跳机制

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

  9. Netty教程07:心跳检测机制

    需求:编写一个 Netty心跳检测机制案例, 当服务器超过3秒没有读时,就提示读空闲 当服务器超过5秒没有写操作时,就提示写空闲 实现当服务器超过7秒没有读或者写操作时,就提示读写空闲 Server ...

最新文章

  1. 我是如何设计 Upload 上传组件的
  2. app图标圆角角度_怎样使用sketch绘制标准APP图标圆角矩形背景?
  3. MySQL server has gone away报错原因分析及解决办法
  4. sql server2005 出现一个或多个参数无效
  5. 类属性、类方法;私有属性、公有属性;私有方法、公有方法;静态属性、静态方法;python的命名规范__xx__\__xx\_xx(自用笔记)
  6. (33)调试驱动程序
  7. CSS深入理解vertical-align和line-height的基友关系
  8. 第十章:在Spark集群上掌握比较重要的图操作之Computing Degree
  9. java找_Java基础之:查找
  10. Say“No”,你学会了吗?
  11. 设置javadoc模板
  12. ASCII码值转化十六进制,十进制数;十六进制字符值转十进制,ASCII码值;
  13. SpriteKit快速入门和新时代iOS游戏开发指南
  14. galerkin有限元法matlab实现,应用Matlab实现有限元分析.pdf
  15. 最高效“双11”背后:圆通更不一样了
  16. 伊利诺伊大学厄本那 香槟分校计算机科学,美国伊利诺伊大学厄本那香槟分校专业设置...
  17. 一文读大厂微服务水平
  18. java毕业设计—— 基于java+JSP+SSH的婴幼儿产品销售系统设计与实现(毕业论文+程序源码)——婴幼儿产品销售系统
  19. C/C++植物大战僵尸之CE找基址+修改器制作(基础版)
  20. 手机号码归属地查询,免费API

热门文章

  1. 离散数学及其应用复盘 | 第3版第5章——二元关系思维导图梳理(复习专用)
  2. 计算机应用基础结课考试,计算机应用基础课考试试题.doc
  3. 微信怎样设置群发消息?干货技巧!微信如何操作群发消息?
  4. JS实现网页全屏和退出
  5. 倩女幽魂Online 倩女助手+模块+作品【新版】
  6. 文本处理神器Awk语言详解
  7. (附源码)springboot校园疫情智慧防控微信小程序 毕业设计011133
  8. 翻译 | ORB-SLAM: a Versatile and Accurate Monocular SLAM System(ORB-SLAM:一种通用的(全能的)精确的单目SLAM系统)
  9. 李开复博士给中国大学生的四封信
  10. 移动硬盘数据丢失恢复教程