0

我正在使用 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 service network restart的身份执行这一行)。第二天我试着再做一次测试,我得到了同样的例外。我检查了时间是否仍然是 0(你可以通过在命令行cat /proc/sys/net/ipv4/tcp_fin_timeout以 root 身份写入来检查它)并且它是 0。我仍然需要等待 1 分钟才能重新连接客户端。

有人可以帮我如何配置这种方式,这样我就不会得到这个异常。等待 1 分钟对于实时应用来说太长了。我知道我可以通过让操作系统动态分配空闲端口号来做到这一点,但这不是我的应用程序需要的。

4

2 回答 2

1

创建客户端套接字之后,但在绑定它或连接到远程服务器之前,您应该调用Socket.setReuseAddress(true)以启用重用客户端端口。

于 2013-08-09T13:41:03.337 回答
0

不要指定固定的客户端端口,使用零。这样你每次都会得到一个新的,或者直到你用完,这意味着你应该在客户端进行连接池。

于 2013-08-11T23:28:21.480 回答