在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);
}
}
}