转 mina 遇到的问题

    转:http://littcai.iteye.com/blog/227476

  • Socket服务器在启动是检测到端口被绑定的话会抛出java.net.BindException:Address already in use: JVM_Bind;而MINA不会
  • 客户端在调用connect方法时,如果连接主机或端口失败,并不会抛出任何异常,跟踪MINA源码可知,实际调用的是AbstractPollingIoConnector类的connect0方法,该方法在发生连接异常时创建了一个failedFuture并返回。只有在客户端实际调用connFuture.getSession();时才会抛出RuntimeIoException异常。
    • 在断网(即网络不通)的情况下,抛出java.net.NoRouteToHostException: No route to host
    • 如果连接不到主机或端口并且设置了中断等待时间的情况下,抛出java.net.ConnectException: Connection refused
    • 如果连接不到主机或端口并且未设置了中断等待时间的情况下,不抛出异常,此时获得的session为NULL
    • 如果能连接到主机对应端口,但是未设置awaitUninterruptibly();此时获得的session也为NULL
Java代码   收藏代码
  1. ConnectFuture connFuture = connector.connect(new InetSocketAddress("192.168.0.1"12315));//发生连接异常时该行不会抛异常  
  2. connFuture.awaitUninterruptibly(1000);//如果不加这句,则连接异常时getSession()并不会抛异常,获得的SESSION为NULL  
  3. IoSession session = connFuture.getSession();//取SESSION的时候才抛异常    

 

 未解之谜

MINA的连接是长连接,这在服务器或客户端通讯中断exceptionCaught能捕获异常可以知道。我们也就不需要对客户端长连接再做心跳包的处理。不过不明白connector.setConnectTimeout(1);这个方法到底有什么作用???

 

  IDLE

1.1.7版本中,session可以直接设置idle时间;

2.0中需要如下代码设置idle时间:session.getConfig().setBothIdleTime(5);

猜你喜欢

转载自blackproof.iteye.com/blog/1895382