当 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());
}
}
}
浙公网安备 33010602011771号