在特定场景下,Netty服务端也需要去检查客户端连接的使用情况,当超过配置的时间没有收到客户端的信息时,服务端应该主动关闭客户端的连接。
首先,在pipeline中添加IdleStateHandler,到了Constants.READ_IDLE_TIME时间,客户端还没有发送消息给客户端,会触发userEventTriggered事件。
pipeline.addLast(new IdleStateHandler(Constants.READ_IDLE_TIME,0,0));
我们可以在我们的业务Handler中对userEventTriggered进行拦截,并处理。
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object o) throws Exception {
String sessionId = ctx.channel().attr(Constants.SessionConfig.SERVER_SESSION_ID).get();
//如果70秒没有收到客户端的信息,则关闭连接
if ( o instanceof IdleStateEvent && ((IdleStateEvent) o).state().equals(IdleState.READER_IDLE)){
log.debug(IdleState.READER_IDLE +"... from "+sessionId+" nid:" +ctx.channel().id().asShortText());
Long lastTime = (Long) ctx.channel().attr(Constants.SessionConfig.SERVER_SESSION_HEARBEAT).get();
if(lastTime == null || ((System.currentTimeMillis() - lastTime)/1000>= Constants.ImserverConfig.PING_TIME_OUT))
{
connertor.close(ctx);
}
}
}