mina连接莫名断开,是不是有什么特殊属性要设置?
用mina做了一个客户端,由于初学和业务的需要,这里采用了同步方式来进行通信。
在和第三方服务器的通信过程中,经常发生超时的现象,经过跟踪调试发现,超时请求发出之前,自己维护的IoSession对象已断开了连接(即isConnected()返回true)。
同样的事情,同事用C++写的客户端,一次断连的情况都没发生过。虽然我在请求发出之前重连了断开的连接,解决了问题,但是还是不解为什么会出现比较频繁的断连,handler里的sessionClosed事件会被触发很多次,客户端亦无主动断开连接的代码。连接的代码如下:
private boolean connect(){ connector = new NioSocketConnector(); DefaultIoFilterChainBuilder chain = connector.getFilterChain(); chain.addLast("mdc", new MdcInjectionFilter()); chain.addLast("codec", new ProtocolCodecFilter(new ATClientCodecFactory(Charset.forName("GB2312")))); chain.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool())); chain.addLast("logging", new LoggingFilter()); connector.setHandler(new ATClientHandler()); //ConnectFuture cf = connector.connect(new InetSocketAddress(address, port)); // Wait for the connection attempt to be finished. cf.awaitUninterruptibly(); if(cf.isConnected()){ session = cf.getSession(); //TODO remove idle in 2013-01-22 //session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60 * 5); }else{ //connector.dispose(true); LOGGER.error("连接失败,注销连接器"); } return cf.isConnected(); }handler中部分代码:
@Override public void sessionCreated(IoSession session) throws Exception { // Empty handler SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig(); cfg.setUseReadOperation(true); cfg.setWriteTimeout(30); cfg.setKeepAlive(true); cfg.setSoLinger(0); cfg.setTcpNoDelay(true); } @Override public void sessionClosed(IoSession session) throws Exception { LOGGER.info("session"+session.getId()+" closed from " + session.getRemoteAddress()); }欢迎各位来指点迷津,先谢过了
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
mina客户端10s发送心跳仍然没有效果,收到服务器的心跳应答不到几秒就会弹出连接超时
mina 的心跳推荐是最好在60秒以内
还可以设置链路超时时间
mina 的心跳推荐是最好在60秒以内
还可以设置链路超时时间
起初我是做了心跳的,2分钟未有读写发生就请求一次系统时间(有读写发生应该不会超时吧?),是不是这个时间太长?
socket连接超时了吧,mina有默认设置的吧,最好有心跳检测