当 DotNetty.Transport.Channels.IChannel 有一段时间没有执行读取、写入或同时执行这两项操作时,触发 DotNetity.HHandlers.Timeout.IdleStateEvent

支持的空闲状态 PropertyMeasure readerIdleTime 当在指定的时间段内未执行读取时,将触发状态为 DotNetty.HHandlers.Timeout.IdleState.ReaderIdle 的 DotNetity.Handlers.Timeout.IdleStateEvent
指定0以禁用。

writerIdleTime 状态为 DotNetty.HHandlers.Timeout.IdleStateEvent 的 DotNety.Handlers.TTimeout.IdleState.WriterIdle 将在指定时间段内未执行写入时触发。
指定0以禁用。

allIdleTime 当在指定的时间段内既没有执行读取也没有执行写入时,将触发状态为 DotNetty.Handlers.Timeout.IdleState.AllIdle的DotNetity.Handlers.Timeout.IdleState 事件。
指定0以禁用。

一个在30秒内没有出站流量时发送ping消息的示例。

当60秒内没有入站流量时,连接将关闭。

var bootstrap = new DotNetty.Transport.Bootstrapping.ServerBootstrap();
bootstrap.ChildHandler(new ActionChannelInitializer<ISocketChannel>(channel =>
{
  IChannelPipeline pipeline = channel.Pipeline;
  pipeline.AddLast("idleStateHandler", new DotNetty.Handlers.Timeout.IdleStateHandler(60, 30, 0);
  pipeline.AddLast("myHandler", new MyHandler());
}

// 处理程序应处理由 DotNetty.Handlers.Timeout.IdleStateHandler 触发的 DotNetity.HandlersTimeout.IdleStateEvent

  public class MyHandler : ChannelDuplexHandler
  {
    public override void UserEventTriggered(DotNetty.Transport.Channels.IChannelHandlerContext context, System.Object evt)
    {
      if(evt is DotNetty.Handlers.Timeout.IdleStateEvent)
      {
        DotNetty.Handlers.Timeout.IdleStateEvent e = (DotNetty.Handlers.Timeout.IdleStateEvent) evt;
        if (e.State == DotNetty.Handlers.Timeout.IdleState.ReaderIdle)
        {
          ctx.close();
        }
        else if(e.State == DotNetty.Handlers.Timeout.IdleState.WriterIdle)
        {
          ctx.writeAndFlush(new PingMessage());
        }
    }
  }

posted on 2023-08-03 00:21  正宗昨夜风  阅读(83)  评论(0)    收藏  举报