如果我的程序在终止之前没有执行ServerSocket.close()
和/或Socket.close()
,那么下次启动程序时,它会在尝试开始监听时抛出IOException
在港口。
这通常不是因为我忘记在程序结束时放置close()
,而是当我强制关闭程序并且永远没有机会执行close()
时。看来我必须注销并登录我的Linux机器才能摆脱“被占用的套接字”。我想知道是否有人知道我可以清除任何未封闭的套接字,以防服务器从终端或任何其他方法强行结束?
我已经尝试过禁用和启用我的网络连接,但仍然没有运气。
答案 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