netty的读写检测机制

本文介绍了一种使用Netty框架实现服务端在特定时间内未收到客户端数据时,自动断开连接的方法。通过配置IdleStateHandler,服务端能在8分钟内未接收到客户端消息时触发读等待超时事件,进而关闭连接。

应用场景:公司系统作为服务端,客户的设备作为客户端,要求平台在5-10分钟之内如果没有收到子站数据,平台就主动断开与子站的连接

解决方式:

使用netty服务端  intializer代码如下

public class MkChannelInitializer extends ChannelInitializer<SocketChannel> {

	@Override
	protected void initChannel(SocketChannel ch) throws Exception {
		ChannelPipeline pipeline = ch.pipeline();
		// 如果服务端8分钟没有接收到客户端的数据
		// 4分钟内没有向客户端发送数据
		// 8分钟内客户端服务端没有交互
		// 会触发事件
		pipeline.addLast(new IdleStateHandler(30, 20, 30,TimeUnit.SECONDS));
		pipeline.addLast(new MkMessageDecoder());
		pipeline.addLast(new MkMessageEncoder());
		pipeline.addLast(new MkMessageHandler());
	}

}

自定义handler里面需要重写方法 

@Override
	public void userEventTriggered(ChannelHandlerContext ctx, Object evt)
			throws Exception {
		if (evt instanceof IdleStateEvent) {
			IdleStateEvent event = (IdleStateEvent) evt;
			String evenType = null;
			// 读等待超时事件触发之后,服务端关闭连接
			if (event.state() == IdleState.READER_IDLE) {
				log.info(
						"conn {} not accept any message in 8 min, do close this connection ..",
						ctx.channel().remoteAddress());
				System.out.println("close:"+ctx.channel().remoteAddress());
				ctx.channel().close();
			}
		}
	}

这种方式不仅仅包括读等待超时事件,同时也包括写等待超时、读写等待超时事件的监听

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值