用Java接收UDP数据

时间:2012-11-14 06:49:33

标签: java sockets networking udp

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

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

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

这是stacktrace:

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

4 个答案:

答案 0 :(得分:17)

我不想复活和旧帖,但我不认为这个问题的答案是正确的。当我使用类似的代码创建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

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

new DatagramSocket()

根据javadoc

  

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

因此,异常的原因是您正在尝试绑定已绑定的套接字。要使其工作,您需要使用下面的构造函数

创建一个unbond套接字
DatagramSocket socket = new DatagramSocket(null);
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);

希望这会有所帮助......

答案 1 :(得分:1)

执行 netstat -a -o -n
从这里你可以发现这个端口是否已经绑定(即使从这个端口你可以得到所有的绑定端口)。如果是,则尝试任何其他端口:)

答案 2 :(得分:1)

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

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

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

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

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

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

答案 3 :(得分:0)

检查端口3000,它可能已被其他应用程序使用。尝试使用其他端口。