java.net.BindException,即使我正确地关闭了我的套接字

java.net.BindException even though I'm properly closing my sockets

提问人:Archonic 提问时间:12/12/2022 更新时间:12/12/2022 访问量:29

问:

我目前正在尝试创建一个程序来测试 TCP 和 UDP 之间的通信速度。但是,我遇到了一个问题。在第二次试验中调用客户端方法时,它会崩溃并出现以下错误:connectTCP

Exception in thread "main" java.net.BindException: Address already in use (Bind failed)
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:513)
    at java.net.Socket.bind(Socket.java:661)
    at me.gabriel.sciencefair.TestClient.connectTCP(TestClient.java:30)
    at me.gabriel.sciencefair.ClientController.main(ClientController.java:9)

我不确定为什么会这样。我可能会一遍又一遍地调用该方法,但我正确地断开了套接字,这应该足以让套接字解绑,对吧?此外,在服务器端,程序运行良好,并耐心等待客户端连接以进行另一次试用(不会发生)。connectTCP


起初,我在 UDP 上收到此错误,因为(非常合乎逻辑)我对客户端和服务器使用相同的地址/端口。我通过在服务器和客户端添加两个常量来解决这个问题,分别称为 和 。对于这两个,分别是 和 is 以及客户端和服务器。两者都绑定到它们的 IP 和 PORT,并连接到 and(分别为客户端和服务器)方法的参数中指定的 ip 和端口。我一遍又一遍地运行这些方法,无论我在实验中需要多少次试验。在第二次试验中,客户端抛出错误。MY_IPMY_PORTMY_IPlocalhostMY_PORT1234412345connectTCP()startTCP()

我的代码可以在 https://github.com/Archonic944/ProtocolSpeedTest 查看。

Java 套接字 IO

评论

0赞 access violation 12/12/2022
顺便说一句,您需要在此处发布代码才能查看它;没有人喜欢异地代码。

答:

0赞 access violation 12/12/2022 #1

您正在客户端执行绑定。没有必要。TCP 的常见模式是服务器绑定到特定端口,但客户端只让堆栈选择一个空闲的“临时”端口。

(客户端也不需要绑定到接口)。

您可能违反了端口在断开连接后一段时间内不可用的要求(请参阅 TCP 状态图中的TIME_WAIT状态)。使用临时端口可以避免这种情况,因为每次都会获得不同的端口号。

如果在运行客户端一次后立即在终端窗口中运行“netstat”,则会看到TIME_WAIT状态。