日期:2014-05-17  浏览次数:20675 次

ServerSocket CLOSE_WAIT的问题
我最近用SOCKET做了个小应用,因为我不懂SOCKET,所以就从网上下了个聊天室的代码,然后改改

现在这个程序可以运行,但是每过一段时间他就不接受请求了,但也没发生异常,其他子线程还在正常运行

经过几天的努力,终于发现一个可能的原因,我用netstat查看端口,发现SOCKET占用的8080端口有很多连接都处在CLOSE_WAIT状态。大约有近100个。

搜索后才知道如果客户端主动断开socket,那服务器端有一定几率不关闭这个socket连接,而是处在CLOSE_WAIT状态,但我不知道怎么解决这个问题,有没有高手说下。

------解决方案--------------------
1.将Socket close方法换成shutdownOutput,将不会使用"half-duplex" 关闭方式,或者 
2.在Socket close之前,加上 
while (true) {
if (dis.read() == -1) { 
break; 


确定对方已经关闭后再关闭(隐含把未读的数据也读了)。 
个人觉得第二种改法更符合逻辑,应用层的功能不应该依赖底层协议的细节。
程序中最初是按第一种改法改的,后来就没动,倒也没想到什么实际的问题。