忘记关闭ServerSocket

时间:2010-12-29 19:24:10

标签: java linux sockets tcp

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

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

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

7 个答案:

答案 0 :(得分:5)

与您的信念相反,您不会终止您的计划。如果它已经存在,套接字将被释放,我不相信你在这里找到了linux内核中的错误:)。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-2)

sudo / sbin / service network restart

答案 6 :(得分:-2)

/etc/init.d/networking restart