ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Netty 读写检测机制(心跳)

2019-08-04 15:54:27  阅读:198  来源: 互联网

标签:Netty eventType 读写 服务端 心跳 new public 空闲


一、创建服务端

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秒

重启服务端和客户端

 

标签:Netty,eventType,读写,服务端,心跳,new,public,空闲
来源: https://www.cnblogs.com/linlf03/p/11298431.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有