在TCP长连接或者WebSocket长连接中一般我们都会使用心跳机制–即发送特殊的数据包来通告对方自己的业务还没有办完,不要关闭链接。

网络的传输是不可靠的,当我们发起一个链接请求的过程之中会发生什么事情谁都无法预料,或者断电,服务器重启,断网线之类。

如果有这种情况的发生对方也无法判断你是否还在线。所以这时候我们引入心跳机制,在长链接中双方没有数据交互的时候互相发送数据(可能是空包,也可能是特殊数据),对方收到该数据之后也回复相应的数据用以确保双方都在线,这样就可以确保当前链接是有效的。

实现心跳机制:

  • TCP协议自带的心跳机制来实现;
  • 在应用层来实现。

TCP协议自带的心跳机制系统默认是设置的是2小时的心跳频率。它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。另外该心跳机制是与TCP协议绑定的,那如果我们要是使用UDP协议岂不是用不了。

自己实现呢大致的策略是这样的:

  1. Client启动一个定时器,不断发送心跳;
  2. Server收到心跳后,做出回应;
  3. Server启动一个定时器,判断Client是否存在,这里做判断有两种方法:时间差和简单标识。

时间差:

  1. 收到一个心跳包之后记录当前时间;
  2. 判断定时器到达时间,计算多久没收到心跳时间=当前时间-上次收到心跳时间。如果改时间大于设定值则认为超时。

在Netty中提供了IdleStateHandler类来进行心跳的处理,它可以对一个 Channel 的 读/写设置定时器, 当 Channel 在一定事件间隔内没有数据交互时(即处于 idle 状态), 就会触发指定的事件。

该类可以对三种类型的超时做心跳机制检测:

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

  • readerIdleTimeSeconds:设置读超时时间;
  • writerIdleTimeSeconds:设置写超时时间;
  • allIdleTimeSeconds:同时为读或写设置超时时间;
  1. 首先客户端激活channel,因为客户端中并没有发送消息所以会触发客户端的IdleStateHandler,它设置的写超时时间为3s;
  2. 然后触发客户端的事件机制进入userEventTriggered方法,在触发器中计数并向客户端发送消息;
  3. 服务端接收消息;
  4. 客户端触发器继续轮询发送消息,直到计数器满不再向服务端发送消息;
  5. 服务端在IdleStateHandler设置的读消息超时时间5s内未收到消息,触发了服务端中handler的userEventTriggered方法,于是关闭客户端的链接。

最新文章

  1. spring-mybatis jar下载地址
  2. mysql 字符集设置方法
  3. MorkDown 常用语法总结
  4. 8VC Venture Cup 2016 - Elimination Round
  5. ***CI新增记录成功后的返回值判断,是用isset还是empty
  6. VS2013中修改.dll工程项目的.lib和.dll的输出路径
  7. 为什么样本方差(sample variance)的分母是 n-1?
  8. Eclipse正在使用Ant扑灭Android数据包错误的解决方案 – Perhaps JAVA_HOME does not point to the JDK
  9. migo的增强
  10. App瘦身、性能优化总结
  11. 构建Spring Cloud微服务分布式云架构
  12. python程序在命令行执行提示ModuleNotFoundError: No module named 'XXX' 解决方法
  13. 入门SQL操作
  14. python WebDriver如何处理右键菜单
  15. [转] Android开发之如何保证Service不被杀掉(broadcast+system/app)
  16. Excel中输入1时单元格显示为勾
  17. The 10 Best Neighborhoods in Seattle
  18. jstl 使用
  19. 美国谍梦第三至五季/全集The Americans迅雷下载
  20. cassandra运行出现了Unable to gossip with any seeds,cqlsh链接不上,提示connection refused处理办法

热门文章

  1. c#年份筛选
  2. A Child's History of England.31
  3. 了解 Linkerd Service Mesh 架构
  4. 2016广东工业大学新生杯决赛 A-pigofzhou的巧克力棒
  5. 文件管理与XMl、JSON解析
  6. myfs 操作系统课内实验 文件管理系统 Ext2
  7. 2、Redis的安装
  8. mysql中索引,触发器,事务,存储引擎的理解
  9. [BUUCTF]PWN——ciscn_2019_ne_5
  10. Spring 容器的启动过程 流程图 自己看源码的梳理 如有错错误 请指正