【问题标题】:Forgetting to Close a ServerSocket忘记关闭 ServerSocket
【发布时间】:2010-12-29 19:24:10
【问题描述】:

如果我的程序在终止之前没有执行ServerSocket.close() 和/或Socket.close(),那么下次我启动程序时,它会在尝试开始侦听端口时抛出IOException

这通常不是因为我忘记在程序末尾添加close(),而是因为我强制关闭程序并且永远没有机会执行close()。似乎我必须在我的 Linux 机器上注销并登录才能摆脱“占用的套接字”。我想知道是否有人知道我可以清除任何未关闭的套接字,以防服务器从终端或任何其他方法强制结束?

我已经尝试禁用和启用我的网络连接,但仍然没有成功。

【问题讨论】:

  • 如何杀死进程?通过 kill -9?
  • 对不起,我现在不清楚确切的问题。在问题中,您提到您正在“强制关闭程序”,但在对我的回答的评论中,您提到您担心程序本身会崩溃。您担心哪种情况?两者都有吗?

标签: java linux sockets tcp


【解决方案1】:

与您的想法相反,您并没有终止您的程序。如果是这样,套接字就会被释放,而且我不相信你在这里发现了 linux 内核中的错误 :)。

您的主线程可能已终止,但您的应用程序仍然有非守护线程在运行,这将使您的 JVM 保持活动状态。

创建线程后,您必须调用 myThread.setDaemon(true)。

【讨论】:

    【解决方案2】:

    你是在绑定之前在 ServerSocket 上调用[setReuseAddress()][1] 吗?如果没有,那就试试吧。

    【讨论】:

    • 你这是什么意思?我的程序像这样启动一个 ServerSocket...ServerSocket serverSocket = new ServerSocket(1234);并等待连接 Socket socket = serverSocket.accept()。我想补充什么?
    • @AeroDroid 使用new ServerSocket() 创建一个未绑定的服务器套接字,然后在其上调用setReuseAddress(true),然后通过调用bind() 方法之一将其绑定到一个地址。
    【解决方案3】:

    使用“netstat -a”命令检查该端口的状态。我怀疑它将处于 CLOSE-WAIT 状态。这是 TCP 按设计工作的一个案例,将出现在任何语言和操作系统中。最终内核将超时等待您的程序关闭套接字并将其清除。您可以减少此超时,但最好的解决方案是确保您的程序完全关闭。

    【讨论】:

    • @JTON:但是一旦一个进程被杀死,sockets fd 不是立即释放吗?尽管关于不能立即重用套接字的评论你是对的。但是为什么它们会关闭-等等?
    • 我认为你是对的。我敢打赌这将是 TIME-WAIT 而不是 CLOSE-WAIT。我已经有一段时间没有遇到这个问题了。
    • @JTON:如果进程产生了线程并且没有被强制杀死,可能进程仍在后台运行并且fd仍然被持有?
    • 这就是为什么我想用 TIME-WAIT 代替。这在文件描述符关闭后发生在 TCP 中。基本上是为仍在网络上的任何数据包提供清除时间。
    【解决方案4】:

    由于您关心的是 JVM 意外停止时会发生什么,我认为您需要的是关闭挂钩。看看下面的链接: http://www.devx.com/getHelpOn/10MinuteSolution/20459/1954

    【讨论】:

    • 不。它不是;关机钩子根本不会帮助你。第一,它们仅在进程正常终止时执行(kill -TERM/9)不会执行钩子。如果进程正常终止,则套接字 FD 将正常释放。
    • 是的,我同意你的看法,我意识到 Shutdown Hooks 只会在我安全终止时运行。我实际上认为我自己解决了这个问题。
    【解决方案5】:

    你的“程序”是什么?它是否拥有该进程,或者它只是一个插入容器的模块。终止进程会关闭与该进程关联的所有套接字,因此不需要显式 close(),或者至少不需要防止 java.net.BindException。

    您确定程序实际上终止了它的执行,这是您最关心的问题。

    【讨论】:

      【解决方案6】:

      sudo /sbin/service 网络重启

      【讨论】:

        【解决方案7】:

        /etc/init.d/networking restart

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-02
          • 1970-01-01
          • 2017-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-25
          • 2014-11-04
          相关资源
          最近更新 更多