應用場景:公司系統作爲服務端,客戶的設備作爲客戶端,要求平臺在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();
}
}
}
這種方式不僅僅包括讀等待超時事件,同時也包括寫等待超時、讀寫等待超時事件的監聽