这种连接超时问题也有很多原因,我也在百度上找到过很多解决办法,但并不能解决我的问题,所以解决办法视情况而定。
我出现这种问题的原因是服务器接受数据到响应的过程中mina自动close掉了session,因此执行后面的程序会报连接超时错误。
public class MinaSocketTextLogger extends IoFilterAdapter {
public final static String CREATED = "CREATED";
public final static String OPENED = "OPENED";
public final static String CLOSED = "CLOSED";
public final static String IDLE = "IDLE";
public final static String EXCEPTION = "EXCEPTION";
public final static String RECV = "RECEIVED";
public final static String SENT = "SENT";
// session创建的时候,调用
@Override
public void sessionCreated(NextFilter nextFilter, IoSession session) {
LoggerUtils.getLogger(session).info(CREATED);
// 下面的sessionCreated方法,调用了SwitcherDeckHandler的created方法
nextFilter.sessionCreated(session);
}
// session打开的时候,调用
@Override
public void sessionOpened(NextFilter nextFilter, IoSession session) {
LoggerUtils.getLogger(session).info(OPENED);
// 下面的sessionOpened方法,调用了SwitcherDeckHandler的Opened方法
nextFilter.sessionOpened(session);
}
// session关闭的时候,调用
@Override
public void sessionClosed(NextFilter nextFilter, IoSession session) {
//LoggerUtils.getLogger(session).info(CLOSED);
//nextFilter.sessionClosed(session);
}
// 当session空闲的时候,调用
@Override
public void sessionIdle(NextFilter nextFilter, IoSession session,
IdleStatus status) {
// LoggerUtils.getLogger(session).info(IDLE);
//session.close(true);
nextFilter.sessionClosed(session);
nextFilter.sessionIdle(session, status);
}
// 当捕捉到异常的时候,调用
@Override
public void exceptionCaught(NextFilter nextFilter, IoSession session,
Throwable cause) {
LoggerUtils.getLogger(session).info(EXCEPTION, cause);
nextFilter.exceptionCaught(session, cause);
}
// 当消息被接收到的时候,调用
@Override
public void messageReceived(NextFilter nextFilter, IoSession session,
Object message) {
LoggerUtils.getLogger(session).info(RECV + "\t" + message);
// 下面的messageReceived方法,调用了SwitcherDeckHandler的received方法
nextFilter.messageReceived(session, message);
}
// 当发出消息给客户端的时候,调用
@Override
public void messageSent(NextFilter nextFilter, IoSession session,
WriteRequest writeRequest) {
byte[] cmd = (byte[]) writeRequest.getMessage();
LoggerUtils.getLogger(session).info(
SENT + "\t\t" + TripleDesHelper.byte2hex(cmd, cmd.length));
nextFilter.messageSent(session, writeRequest);
}
@Override
public void filterClose(NextFilter nextFilter, IoSession session) {
LoggerUtils.getLogger(session).info("Filter closed");
}
}
解决办法:把sessionClosed方法中关闭session的代码注释掉,复制到sessionIdle方法中。
由于sessionIdle是空闲时才调用的,所以为了避免有太多的session没有被关闭,可以在MInaServer.java中设 置 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,60);一分钟应该足够处理并响应了。