原帖:
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
分享到:
相关推荐
10. **关闭连接**:当不再需要连接时,调用`IoSession.close()`方法,MINA会负责优雅地关闭连接,释放相关资源。 总结,MINA框架提供了强大的工具,使得开发TCP客户端变得简单而高效,特别是对于需要长连接的应用,...
服务器代码可在web项目中使用,客户端代码可以在Android开发时使用,本例子中没有将登录信息保存到IOSession中,在实际开发中,可以将登录信息保存到服务器端的iossion对象中,当前,也可以将其他会话有关的信息保存...
2. **创建IoSession**:IoSession是Mina的核心概念,代表了客户端和服务器之间的会话。客户端需要初始化一个IoConnector来建立连接,并通过connect()方法创建IoSession。 3. **定义ProtocolCodecFilter**:为了进行...
2. **事件驱动**:Mina使用事件驱动架构,通过监听器接口(IoHandler)来处理网络事件,如连接建立、数据接收、连接关闭等。当这些事件发生时,对应的回调方法会被触发。 3. **过滤器链**:Mina的过滤器(Filter)...
《Mina开发之客户端详解》 Apache Mina(Minimum Asynchronous Network)是一个高度可扩展的、高性能的网络应用框架,主要用于构建服务器端的网络应用程序。它简化了网络编程的复杂性,提供了基于事件驱动和异步I/O...
在本示例中,我们将深入探讨一个基于Mina实现的客户端-服务器简易Demo,这将帮助我们快速理解Mina的核心概念和用法。 首先,让我们来看看“minaServer”部分。Mina服务器端主要负责监听网络连接、接收客户端请求并...
Mina2源码分析 Mina2框架源码剖析是 Java 编程语言中一个流行的网络编程框架,用于构建高性能、可扩展的网络应用程序。该框架核心包包括 org.apache.mina.core.service, org.apache.mina.core.session, org.apache....
2. **关闭连接**:一旦确定连接异常,应当立即关闭当前的IoSession。 3. **清理资源**:释放与旧连接相关的资源,如线程、内存等。 4. **重新连接**:创建新的连接尝试,这可能涉及到重试策略,如固定间隔重试、指数...
当IoSession关闭时,如果不通过IoService的close方法,实际连接并不会断开。 IoProcessor接口则在另一个线程上处理数据读写,它有自己的Selector,不同于常规的Java NIO编码方式。IoProcessor还会调用注册的...
在Android应用开发中,通信功能是不可或缺的一部分,而MINA(Mina Network Application Framework)作为一个高效的、可扩展的网络应用程序框架,为开发者提供了构建高性能、高可用性的网络服务的强大工具。...
7. **关闭连接**: 当不再需要连接时,记得调用IoSession的close方法来释放资源。 **MyMina文件** 在压缩包中的"MyMina"文件可能是包含了上述所有组件的实现代码。这个文件或目录可能包含了一系列的Java类,如编码...
在IT行业中,网络通信是应用程序之间交互的基础,而MINA(Multi-purpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用框架,主要用于构建服务器端应用程序。本实例将探讨如何...
Apache Mina2是一个高效的、可扩展的网络应用框架,主要用于简化Java NIO(非阻塞I/O)编程。它的核心组件包括`IoService`、`IoAcceptor`、`IoConnector`、`IoProcessor`和`IoHandler`,这些组件共同协作以处理网络...
在Mina与Socket通信的实现中,服务端通常使用Mina来创建一个Acceptor,监听特定端口,等待客户端的连接请求。一旦有连接建立,Mina会自动触发相应的事件处理器,开发者可以在其中处理数据读写。以下是一个基本的...
标题中提到的"mina2服务端客户端实例"是指使用Apache MINA 2版本创建的一个工作示例,该示例包含了服务端和客户端的完整代码,旨在帮助开发者理解如何在实际项目中运用MINA进行网络通信。通过导入Eclipse这样的集成...
2. **同步客户端**:在同步模式下,客户端每次发送请求后都会等待服务器的响应。这种方式简单易懂,但效率较低,因为每个请求都需要占用一个线程直到响应返回。在MINA中,同步客户端通常使用`IoHandler`接口来处理...
MINA通过IoSession接口提供了对客户端连接的抽象,可以存储客户端的状态信息,方便地识别和管理不同的客户端请求,以及实现客户端之间的通信。 以下是一个简单的MINA服务端代码示例: ```java // 初始化Acceptor,...
长连接是指在一次连接建立后,客户端和服务器端可以反复进行多次数据交换,而不需要频繁地创建和关闭连接,这样可以减少连接建立和释放的开销,提高系统效率。 在MINA中,TCP服务端的实现主要涉及以下知识点: 1. ...
在“MINA2 CS客户端服务器通信”中,我们关注的是如何利用MINA2框架实现客户端与服务器之间的有效通信。下面将详细介绍MINA2框架以及如何实现客户端和服务器的通信。 MINA2全称为"Multi-purpose Infrastructure for...
在本实例中,我们将探讨如何使用Apache Mina2构建一个简单的服务器和客户端。 首先,让我们了解一下Mina2的核心概念。Mina2基于Java NIO(Non-blocking I/O)库,提供了异步I/O操作,这意味着它不会因为等待数据而...