由于项目需要,最近用Java写了一个服务端程序,使用了nio方式。

结果发现了一个问题。
客户端连接到我写的服务端并且跟服务端通信完毕之后,在客户端没有主动断开连接的情况下,为了在服务端断开TCP连接,我调用了
SocketChannel类的close方法,但是通过netstat,我发现TCP连接仍然存在,且状态仍然是ESTABLISHED。

于是我又尝试在调用SocketChannel类的close方法之前先调用SocketChannel.socket().close(), 但是在
调用两个close方法之后,我发现TCP连接仍然存在且状态仍然是ESTABLISHED。

接着我又尝试在调用两个close方法之后,再调用SocketChannel的wirte或read方法,结果只是得到一个异常,TCP连接仍然存在
且状态仍然是ESTABLISHED。

我又尝试在客户端也调用两个close方法,结果在服务端与客户端的close方法都被调用之后,TCP连接仍然存在且状态仍然是
ESTABLISHED。

我试了很久,发现除非退出客户端程序,否则TCP连接会一直存在。

程序怎么查都查不出错误,google了很久也找不到答案。

最后上sun的论坛发帖求助,经人指点,这才知道,原来是1_5_0_04版的JDK有bug,使用SocketChannel的话关闭连接会出现问题。

换新版本的JDK之后问题解决。

bug的说明见下面的连接

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6347873