3

我正在尝试接收 PlayCap 向 Java 中的网络地址 192.168.103.255 端口 3000 广播的 UDP 数据,但我在设置时遇到了麻烦。这是我所拥有的:

DatagramSocket socket = new DatagramSocket();
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);

我从绑定调用中得到“java.net.SocketException:已经绑定”。我对网络非常缺乏经验,所以我可能在这里做错了什么。任何帮助表示赞赏。

这是堆栈跟踪:

java.net.SocketException: already bound
    at java.net.DatagramSocket.bind(Unknown Source)
    at runner.main(runner.java:16)
4

4 回答 4

24

我不想恢复旧线程,但我认为这个问题的答案不正确。当我使用类似的代码创建 DatagramSocket 时,我遇到了同样的问题。

DatagramSocket socket = new DatagramSocket();
socket.setReuseAddress(true);
socket.bind(new InetSocketAddress(InetAddress.getByName("localhost"), 5566));

这会导致 SocketException

Exception in thread "main" java.net.SocketException: already bound
at java.net.DatagramSocket.bind(DatagramSocket.java:376)
at testapplication.TestApplication.main(TestApplication.java:25)

Java 结果:1

不是因为有另一个进程占用同一个端口,而是当我使用默认构造函数时,我创建了一个已经绑定的数据报套接字。

new DatagramSocket()

根据javadoc

DatagramSocket() 构造一个数据报套接字并将其绑定到本地主机上的任何可用端口。

所以异常的原因是你试图绑定一个已经绑定的套接字。要使其工作,您需要使用以下构造函数创建一个未绑定套接字

DatagramSocket socket = new DatagramSocket(null);
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);

希望这可以帮助...

于 2015-03-09T07:52:37.923 回答
1

很可能您的应用程序运行了两次。或者您可能会执行两次相同的代码。即使是同一个应用程序在绑定两次时也可能会失败。

对于初学者来说发生了很多事情,他们没有关闭他们之前的尝试(我也发生过),然后他们的端口已经在使用中。确保添加适当的异常处理,例如通过弹出消息“端口已在使用中”。

请注意,对于侦听,您通常只会绑定一个端口,没有明确的地址(您可能需要为此使用“0.0.0.0”)。然后您可以同时接收广播和单播。

我用于收听广播的代码很简单:

DatagramSocket s = new DatagramSocket();
s.bind(new InetSocketAddress(port))

请注意,我没有绑定到特定地址,而只是绑定到端口。

于 2012-11-14T07:14:49.453 回答
1

执行
netstat -a -o -n
并从中您可以发现该端口是否已经绑定(即使从这里您也可以获取所有绑定的端口)。如果是,请尝试任何其他端口:)

于 2012-11-14T07:01:35.853 回答
0

检查端口 3000 它可能已被另一个应用程序使用。尝试使用不同的端口。

于 2012-11-14T06:54:30.103 回答