用Java接收UDP数据

ajl*_*u13 3 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);
Run Code Online (Sandbox Code Playgroud)

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

这是堆栈跟踪:

java.net.SocketException: already bound
    at java.net.DatagramSocket.bind(Unknown Source)
    at runner.main(runner.java:16)
Run Code Online (Sandbox Code Playgroud)

roz*_*din 19

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

DatagramSocket socket = new DatagramSocket();
socket.setReuseAddress(true);
socket.bind(new InetSocketAddress(InetAddress.getByName("localhost"), 5566));
Run Code Online (Sandbox Code Playgroud)

这导致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)
Run Code Online (Sandbox Code Playgroud)

Java结果:1

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

new DatagramSocket()
Run Code Online (Sandbox Code Playgroud)

根据javadoc:

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

因此,异常的原因是您尝试绑定已绑定的套接字.要使其工作,您需要使用下面的构造函数创建一个unbond套接字

DatagramSocket socket = new DatagramSocket(null);
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助...