netty的讀寫檢測機制

應用場景:公司系統作爲服務端,客戶的設備作爲客戶端,要求平臺在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();
			}
		}
	}

這種方式不僅僅包括讀等待超時事件,同時也包括寫等待超時、讀寫等待超時事件的監聽

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章