文章目录

  1. 1. 为什么要心跳检测
  2. 2. 如何实现心跳检测

为什么要心跳检测

网络连接中,处理空闲事件是很常见的,一般情况下,客户端与服务端在指定时间内没有任何读写请求,就会认为连接是空闲的。此时,客户端需要向服务端发送心跳包消息,来维持服务端与客户端的连接。

如何实现心跳检测

添加处理器,这个处理器在ChannelInitializer的initChannel方法中添加。

ch.pipeline().addLast(new IdleStateHandler(60, 15, 30, TimeUnit.SECONDS));

这个处理器,它的作用就是用来检测客户端的读取超时的,第一个参数是指定读操作空闲秒数,第二个参数是指定写操作的空闲秒数,第三个参数是指定读写空闲秒数,当有操作操作超出指定空闲秒数时,便会触发UserEventTriggered事件。所以我们只需要在自己的handler中截获该事件,然后发起相应的操作即可,比如说发起心跳操作。

@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
    if (evt instanceof IdleStateEvent) {
        IdleStateEvent event = (IdleStateEvent) evt;
        if (event.state().equals(IdleState.READER_IDLE)) {
            //未进行读操作
            System.out.println("READER_IDLE");
            // TO DO SOMETHING
            // 超时关闭channel
      ctx.close();
        } 
        else if (event.state().equals(IdleState.WRITER_IDLE)) {
            //未进行写操作
            System.out.println("WRITER_IDLE");
            // TO DO SOMETHING
        } 
        else if (event.state().equals(IdleState.ALL_IDLE)) {
            //未进行读写操作
            System.out.println("ALL_IDLE");
            // 发送心跳消息
        }
    }
}

服务端在30s内未进行读写操作,就会向客户端发送心跳包,客户端收到心跳包后立即回复心跳包给服务端,此时服务端就进行了读操作,也就不会触发IdleState.READER_IDLE(未读操作状态),若客户端异常掉线了,并不能响应服务端发来的心跳包,在60s后就会触发IdleState.READER_IDLE(未读操作状态),此时服务器就会将通道关闭。

(完)

微信公众号

文章目录

  1. 1. 为什么要心跳检测
  2. 2. 如何实现心跳检测