【问题标题】:Socket not closing when calling socket.close()调用 socket.close() 时套接字未关闭
【发布时间】:2010-10-13 00:10:26
【问题描述】:

我在这个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();
      }
}

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

是解决我问题的方法吗?

有没有办法可以关闭另一个“活动”套接字?

【问题讨论】:

  • 你确定while循环结束了吗?
  • 服务器端在监听什么?您可以访问代码吗?
  • 是的,我可以访问代码。我正在监听一个服务器,它将为我提供股票数据。
  • 是的,while 循环结束。即使它没有结束并且我强制它结束,这也不会关闭另一个套接字。
  • 什么问题?什么例外?什么错误信息?要具体。

标签: java sockets


【解决方案1】:

试试

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我没有服务器代码,也没有我面前的服务器(它在另一个城镇)。那么我怎样才能让事情正常进行呢? (因为我没有看到任何代码:s)
      猜你喜欢
      • 2011-03-19
      • 2013-01-03
      • 2012-09-24
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多