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