调用socket.close()时套接字没有关闭

时间:2010-10-12 08:55:58

标签: java sockets

我在post中发现了同样的问题,但我认为它没有解决。

我将简短,这是我的代码:

try {
Socket pacConx = new Socket(ip, Integer.parseInt(port));
DataInputStream  dataIn = new DataInputStream(pacConx.getInputStream());
DataOutputStream dataOut = new DataOutputStream(pacConx.getOutputStream());

while(){...}
} catch (IOException e) {
    logger.fatal("error", e);
}finally{
    if (dataIn != null) {
           dataIn.close();
     }
     if (dataOut != null) {
            dataOut.close();
     }
      if (pacConx != null) {
            pacConx.close();
      }
}

首先,我使用上面的代码连接到服务器,然后成功。 但是,当我尝试重新连接到同一服务器和端口一段时间后,我无法重新连接。 显然,第一个套接字仍然在serverSide中“活着”。

是我的peoblem的解决方案吗?

有没有办法可以关闭另一个“活”插座?

3 个答案:

答案 0 :(得分:0)

尝试

...
dataOut.flush();
dataOut.close();
...

粘贴错误消息或/和完整堆栈跟踪。

答案 1 :(得分:0)

您需要启动有序断开连接。在流上调用flush之后,在socket上调用close之前,添加:

pacConx.shutdownInput();
pacConx.shutdownOutput();

告诉远端您已完成并允许它拆除端口而无需等待确保数据仍在传输中。

答案 2 :(得分:0)

关闭套接字后约2-4分钟,它将在服务器上以“CLOSE_WAIT”状态挂起。这是TCP / IP协议的正常部分,用于处理仍然在网络中闲逛的延迟数据包。

这应该由您的服务器代码处理。是否在处理请求时尝试取消绑定侦听套接字并在关闭后尝试重新建立它?如果是这样,它应该在处理期间保持监听或使用SO_REUSEADDR选项重新建立它。