我在CentOS 5上运行一些java代码
java Something.java &
在某个端口上创建一个套接字....说9090
..然而,代码没有完全运行,所以我Ctrl-C
就出现了。
当我再次尝试运行该程序时,它错误地说它无法连接到端口9090
。
当我将端口号更改为9010
之类的任意内容时......一切都有效(除了Something.java
被卡住的事实).... churn and repeat
发生了什么事?我希望能够为这些东西使用一个一致的端口...是否有一些后台进程我不是每次都摆脱它?
谢谢!
答案 0 :(得分:2)
这可能是因为操作系统有一些隔离延迟,直到另一个进程可以重用该地址。
C库提供套接字选项SO_REUSEADDR
,可以设置它以避免这种情况。快速网络搜索表明setReuseAddress(boolean)
中的java.net.ServerSocket
可用于设置此选项。
答案 1 :(得分:0)
JVM可能需要一些时间来实际完成程序并释放套接字。
当ctrl-c使用Runtime.getRuntime().addShutdownHook(...)
终止软件时,您可以手动关闭套接字,我强烈建议所有在后台运行并使用套接字的软件。应该有所帮助。