我正在使用Linux Mint 14 KDE。我已经成功创建了Java tcp服务器和客户端,服务器IP:端口是10.10.1.10:9900,我的客户端IP:端口10.10.1.10:9901。当我第一次连接我的客户端时一切正常。客户端连接并发送一些数据并断开连接。当我尝试在断开连接后立即将客户端与服务器连接时,我得到下一个例外。
java.net.BindException: Address already in use
如果我等待超过1分钟,一切都会好的。在其他论坛上,我读到关闭套接字后,有一个60秒(1分钟)的tcp time_wait。将其更改为0之后一切正常(如果有人想要更改它,只需在 /etc/sysctl.conf 中添加此行 net.ipv4.tcp_fin_timeout = 0 并执行此行在您的终端中以root身份服务网络重启)。第二天我尝试再做一次测试,我得到了同样的例外。我检查了时间是否仍为0(你可以在命令行 cat / proc / sys / net / ipv4 / tcp_fin_timeout 以root身份写这个来检查它)它是0.我还是要等在重新连接客户端之前1分钟。
有人可以帮助我如何配置这种方式,所以我没有得到这个例外。等待1分钟对于实时应用来说太多了。我知道我可以让操作系统动态分配免费的端口号,但这不是我的应用程序所需要的。
答案 0 :(得分:1)
创建客户端套接字后,但在绑定或连接到远程服务器之前,应调用Socket.setReuseAddress(true)
以启用重用客户端端口。
答案 1 :(得分:0)
不指定固定客户端端口,使用零。这样你每次都会得到一个新的,或者直到你用完为止,这意味着你应该在客户端进行连接池。