• 5、netty第四个例子,空闲检测handle


    netty可支持空闲检测的处理器,用于心态检测,当服务器端超出等待时间,没发生事件时,会触发handler中的方法 userEventTriggered。

    initializer

     1 import io.netty.channel.ChannelInitializer;
     2 import io.netty.channel.ChannelPipeline;
     3 import io.netty.channel.socket.SocketChannel;
     4 import io.netty.handler.timeout.IdleStateHandler;
     5 
     6 import java.util.concurrent.TimeUnit;
     7 
     8 public class MyServerInitlalizer extends ChannelInitializer<SocketChannel> {
     9     @Override
    10     protected void initChannel(SocketChannel ch) throws Exception {
    11         ChannelPipeline pipeline  = ch.pipeline();
    12 
    13         //空闲事件处理器  读空闲5s    写空闲3s   读写空闲7s  
    14         pipeline.addLast(new IdleStateHandler(5,7,3,TimeUnit.SECONDS)); //空闲检测   在一定时间间隔内 没有读写
    15         pipeline.addLast(new MyServerHandler());//自定义的空闲事件处理器
    16 
    17     }
    18 }

    handler

     1 import io.netty.channel.ChannelHandlerContext;
     2 import io.netty.channel.ChannelInboundHandler;
     3 import io.netty.channel.ChannelInboundHandlerAdapter;
     4 import io.netty.channel.SimpleChannelInboundHandler;
     5 import io.netty.handler.timeout.IdleStateEvent;
     6 
     7 public class MyServerHandler extends ChannelInboundHandlerAdapter {
     8     @Override
     9     public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
    10         //super.userEventTriggered(ctx, evt);
    11         if ( evt instanceof IdleStateEvent) {//如果是一个空闲状态
    12             IdleStateEvent event = (IdleStateEvent) evt;
    13 
    14             String  eventType = null;
    15 
    16             switch (event.state()){
    17                 case READER_IDLE:
    18                     eventType = "读空闲";
    19                     break;
    20                 case WRITER_IDLE:
    21                     eventType = "写空闲";
    22                     break;
    23                 case ALL_IDLE:
    24                     eventType = "读写空闲";
    25                     break;
    26             }
    27 
    28             System.out.println(ctx.channel().remoteAddress() + "超时事件: " + eventType);
    29 
    30             ctx.channel().close();
    31         }
    32     }
    33 }
  • 相关阅读:
    MySQL计算月份间隔的函数
    《认知天性:让学习轻而易举的心理学规律》
    Ubuntu通过iptables配置 ip 代理转发
    Ubuntu开启/var/log/messages
    Ubuntu通过Nginx安装Webdav
    Ubuntu通过iptables防止ssh暴力破解
    frp内网穿透
    Vim配置
    Linux为STDOUT的关键字设置颜色
    Maven项目中在properties 中使用 ${} 来引用pom文件中的属性
  • 原文地址:https://www.cnblogs.com/amibandoufu/p/11442823.html
Copyright © 2020-2023  润新知