在filter包下有个原生态支持,只需实现接口KeepAliveMessageFactory即可。
但是还是有些不算问题的问题,比如在运行时手动设置空闲时间限制,那么会和KeepAliveFilter相互干扰。
例子和源码相对简单,这里贴一个毫无意义的实现,以作参考。
public class KeepAliveTestServer {
public static void main(String[] args) throws IOException {
IoAcceptor acceptor = new NioSocketAcceptor();
KeepAliveFilter keepAliveFilter = new KeepAliveFilter(new KeepAliveMessageImpl());
keepAliveFilter.setForwardEvent(false);
keepAliveFilter.setRequestInterval(30);
keepAliveFilter.setRequestTimeout(10);
keepAliveFilter.setRequestTimeoutHandler(new KeepAliveRequestTimeoutHandler() {
public void keepAliveRequestTimedOut(KeepAliveFilter filter, IoSession session) throws Exception {
System.out.println("连接已无响应...关闭session鸟。KeepAliveRequestTimeoutHandler.CLOSE 和我作用一样,默认就是这个");
session.close(true);
}
});
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
acceptor.getFilterChain().addLast("KeepAlive", keepAliveFilter);
acceptor.getFilterChain().addLast("log", new LoggingFilter());
acceptor.setHandler(new IoHandlerAdapter());
acceptor.bind(new InetSocketAddress(13665));
}
static class KeepAliveMessageImpl implements KeepAliveMessageFactory {
private static final String KAMSG_REQ = "###$$$";
private static final String KAMSG_REP = "$$$###";
public Object getRequest(IoSession session) {
return KAMSG_REQ;
}
public Object getResponse(IoSession session, Object request) {
return KAMSG_REP;
}
public boolean isRequest(IoSession session, Object message) {
return KAMSG_REQ.equals(message);
}
public boolean isResponse(IoSession session, Object message) {
return KAMSG_REP.equals(message);
}
}
}