ServerSocket CLOSE_WAIT的问题

veardn 2010-09-16 02:20:58
我最近用SOCKET做了个小应用,因为我不懂SOCKET,所以就从网上下了个聊天室的代码,然后改改

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

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

搜索后才知道如果客户端主动断开socket,那服务器端有一定几率不关闭这个socket连接,而是处在CLOSE_WAIT状态,但我不知道怎么解决这个问题,有没有高手说下。
...全文
236 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
veardn 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 leehomwong 的回复:]

1.将Socket close方法换成shutdownOutput,将不会使用"half-duplex" 关闭方式,或者
2.在Socket close之前,加上
while (true) {
if (dis.read() == -1) {
……
[/Quote]

我现在关闭socket的方法如下

finally {
try {
if (reader != null) reader.close();
if (writer != null) writer.close();
if (socket != null) socket.close();
reader = null;
writer = null;
socket = null;
this.user.setSocket(null);
this.user.setValid(false);
GameInit.uct.remove(this.user);
} catch (Exception e) {System.out.println(this.user.getUser_id() + e);}
}

是不是要改成
if (socket != null) socket.shutdownOutput();

关于第二种方法,我不懂,能说得详细点吗?
24K純帥 2010-09-16
  • 打赏
  • 举报
回复
1.将Socket close方法换成shutdownOutput,将不会使用"half-duplex" 关闭方式,或者
2.在Socket close之前,加上
while (true) {
if (dis.read() == -1) {
break;
}
}
确定对方已经关闭后再关闭(隐含把未读的数据也读了)。
个人觉得第二种改法更符合逻辑,应用层的功能不应该依赖底层协议的细节。
程序中最初是按第一种改法改的,后来就没动,倒也没想到什么实际的问题。

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧