work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Netty 读写检测机制(心跳)

Posted on 2019-08-04 15:41  work hard work smart  阅读(394)  评论(0编辑  收藏  举报

一、创建服务端

1、MyServer 类

public class MyServer {
    public static void main(String[] args) throws  Exception{
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try{

            ServerBootstrap serverBootstrap = new ServerBootstrap();
            serverBootstrap.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class)
                    .handler(new LoggingHandler(LogLevel.INFO)) //增加日志处理器
                    .childHandler(new MyServerInitializer());

            ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
            channelFuture.channel().closeFuture().sync();
        }finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

  增加日志处理器

 

2、MyServerInitializer 

public class MyServerInitializer extends ChannelInitializer<SocketChannel>{

    protected void initChannel(SocketChannel socketChannel) throws Exception {
        ChannelPipeline pipeline = socketChannel.pipeline();
        pipeline.addLast(new IdleStateHandler(5, 7, 10, TimeUnit.SECONDS));
        pipeline.addLast(new MyServerHandle());
    }
}

  5秒钟没有读事件

  7秒钟没有写事件

  10秒钟没有读写事件

 

3、处理器MyServerHandle 

public class MyServerHandle extends ChannelInboundHandlerAdapter  {


    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if(evt instanceof IdleStateEvent){
            IdleStateEvent event = (IdleStateEvent)evt;

            String eventType = null;

            switch (event.state()){
                case READER_IDLE:
                    eventType = "读空闲";
                    break;
                case WRITER_IDLE:
                    eventType = "写空闲";
                    break;
                case ALL_IDLE:
                    eventType = "读写空闲";
                    break;
            }

            CommonUtil.println(ctx.channel().remoteAddress() + "超时事件: " + eventType);
            //关闭连接
            ctx.channel().close();
        }
    }
}

  

二、客户端代码同上一篇一致

 

三、测试

启动服务端和客户端

1、读空闲

可以发现,5秒钟没有读到消息,将触发超时事件: 读空闲

 

2、写空闲

客户端一直写

 

服务端没有写,7秒所有触发写空闲事件

 

3、读写空闲

把读写空闲事件时间改为3秒

重启服务端和客户端