解决apache mina java.io.IOException: Connection timed out问题

这种连接超时问题也有很多原因,我也在百度上找到过很多解决办法,但并不能解决我的问题,所以解决办法视情况而定。

我出现这种问题的原因是服务器接受数据到响应的过程中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);一分钟应该足够处理并响应了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值