原帖:
http://hi.baidu.com/zeorliu/blog/item/4a5fd3bf5fe6470019d81f1d.html
问题:客户端使用Mina2的NioConnector时,发现IoSesssion.close()在jdk1.5下有时不能彻底关闭tcp连接(用tcpdump或者netstat看连接未关闭),而在jdk1.6下则正常。
发现:需要在mina里边调用SocketChannel.close之后,再调用selectNow。 但是jdk6.0不用selectNow就可以。
解决:为了避免修改mina2源代码,需要在IoHandler的sessionClosed()中,强制调用session.getSelectionKey.selector().selectNow()方法来彻底关闭。但是getSelectionKey是package可见,不能直接调用,还需要通过反射技术来间接调用。
try {//注意,getSelectionKey()和仅getChannel()package可见,需要通过反射来强制调用。
SelectionKey sk = (SelectionKey)MyUtil.invoke(session, "getSelectionKey");
sk.selector().selectNow();//无效果。
}catch(Exception e) {
_log.warn("# sessionClosed() : session.getSelectionKey().selector().selectNow() %s", e);
//_log.error(e, "# sessionClosed()");
}
try {//注意,getSelectionKey()和仅getChannel()package可见,需要通过反射来强制调用。
SocketChannel sc = (SocketChannel)MyUtil.invoke(session, "getChannel");//sc.close();
if (sc.isConnected()) {
sc.socket().shutdownOutput();//有效果。
sc.socket().close();//无效果??
}
}catch(Exception e) {
_log.warn("# sessionClosed() : session.getChannel().socket().shutdownOutput() %s", e);
//_log.error(e, "# sessionClosed()");
}
参考:
http://www.velocityreviews.com/forums/t681805-socketchannel-doesnt-disconnect.html
If I close a SocketChannel like: ((SocketChannel) selectionkey.channel()).close();
How come this returns true when called after the close? Shouldn't it be now disconnected? And how do you force it to disconnect?
((SocketChannel) selectionkey.channel()).isConnected()
Frank Cisco
---
“Peter Duniho wrote: Assuming Java sockets are like most other socket APIs (and I would guess they are), the "isConnected()" method can only tell you the state of the socket as of the most recent i/o operation.”
Exactly so. Ditto isClosed(), isBound(), etc. They tell you which methods *you* have called.
It may or may not be worth noting here that channels that are registered with a Selector don't really close until the next select()/selectNow() operation. This is obscurely described womewhere in the java.nio.channels Javadoc which I can never find when I look for it. The implication for clients that use NIO is that they may need to call Selector.selectNow() to accelerate the actual closing of a channel.
EJP
---
【虎.无名】补充(1)jdk1.5.10以上版本不存在session.close问题。和shenjianlin沟通,目前生产上jdk1.5的都是 1.5.0_12,应该不存在这个问题。
【相关帖子】[url]http://www.blogjava.net/killme2008/archive/2009/09/28/296826.html [/url] java nio的一个严重BUG
分享到:
相关推荐
服务器代码可在web项目中使用,客户端代码可以在Android开发时使用,本例子中没有将登录信息保存到IOSession中,在实际开发中,可以将登录信息保存到服务器端的iossion对象中,当前,也可以将其他会话有关的信息保存...
mina框架实现tcp客户端长连接所需要的jar包
Mina 服务端客户端示例程序
Mina开发之客户端的代码,详情请查看:http://www.cnblogs.com/getherBlog/p/3937196.html
mina2服务端客户端实例,直接导入eclipse项目即可。
Mina2源码分析,mina2框架。mina nio框架。mina用于webgame游戏开发很多。
MINA网络通信框架.pdf
Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP 协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),...Mina 主要有1.x 和2.x 两个分支…………
运行客户端hello会弹出一个窗体,点击按钮模拟客户端主动发送。只是简单的例子很多没有处理,但是基本的数据连接没有问题
Mina2.0完全剖析.doc 远程通信 Mina2 学习笔记
本代码包含mina服务端,同步客户端-即短连接方式,异步客户端-即长连接方式。
http://knight-black-bob.iteye.com/blog/2370938 推送sdk (类似百度 推送 ) android mina (待优化... ) 本demo 研究的是原理,不要计较太多。。。。 至于token生成,service 保活,定时启动 不做说明。
mina框架实现tcp长连接服务端所需要的jar包
java Mina2源码分析
当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。 Apache MINA 2.0.9 发布,此版本是个 bug 修复版本,修复了...
详细介绍mina框架的各个组成部分、服务器端的开发、客户端开发。并根据本人在工程项目中使用的代码,详细讲解了服务器端是客户端实现。实现了json格式的通信、以及文件的上传于下载等功能。图文并茂,以开发者的角度...
mina连接,mina心跳连接,mina断线重连。其中客户端可直接用在android上。根据各方参考资料,经过自己的理解弄出来的。CSDN的资源分太难得了。
Apache MINA 2 用户指南,,epub格式更符合移动端浏览,走过路过不要错过.