应用场景:公司系统作为服务端,客户的设备作为客户端,要求平台在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();
}
}
}
这种方式不仅仅包括读等待超时事件,同时也包括写等待超时、读写等待超时事件的监听