Netty心跳之IdleStateHandler

概述:Netty提供了对心跳机制的天然支持,心跳可以检测远程端是否在线

心跳机制的优势:

  1. 心跳可以检测远程端是否在线,
    2.心跳可以维持客户端与服务器长连接,避免连接被防火墙,路由器关停等

IdleStateHandler介绍:

public class IdleStateHandler implements ChannelHandler {
    //构造器
    public IdleStateHandler(
        long readerIdleTime,
        long writeIdleTime,
        long allIdleTime,
        TimeUnit unit    
    )
    
}

构造器参数说明:

  1. readerIdleTime:为读超时时间
    2.writerIdleTime:为写超时时间
    3.allIdleTime:所有类型的超时时间

使用例子:

new ChannelInitializer<SocketChannel>() {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        /**
        * 配置心跳机制
        * 说明:每隔五秒检查channelRead方法,如果五秒内该方法没有被调用上则会调用
        * userEventTriggered方法。(五秒内服务器没有返回响应,可能说明服务器下线,
        * 调用userEventTriggered方法告知客户端进行处理)
        */
        pipeline.addLast(new IdleStateHeader(5,0,0,TimeUnit.SECONDS));
        //配置:发送数据加密coder
        pipeline.addLast(new RpcEncoder(new GSONSerializer()));

        //配置:接收数据解密coder
        pipeline.addLast(new RpcDecoder(new GSONSerializer()));

        //配置:业务处理Handler
        pipeline.addLast(clientHandler);
        //配置:心跳包Handler
        pipeline.addLast(new Pinger());
    }
}

IdleStateHeader超时状态说明

IdleStateEvent
-IdleState

  • IdleState.READER_IDLE 读超时事件类型
  • IdleState.WRITER_IDLE 写超时事件类型
  • IdleState.ALL_IDL 读或者超时事件超时类型

超时异常处理方法 userEventTriggered

public void userEventTriggered( ChannelHandlerContext ctx, Object evt)
evt 此时的类型为 IdleStateEvent,可通过getState()判断异常类型

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容