我正在尝试接收 PlayCap 广播到 Java 网络地址 192.168.103.255 端口 3000 的 UDP 数据,但我在设置时遇到了问题。这是我拥有的:
DatagramSocket socket = new DatagramSocket();
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);
我从绑定(bind)调用中得到“java.net.SocketException:已绑定(bind)”。我对网络非常缺乏经验,所以我可能在这里做错了一些事情。感谢您的帮助。
这是堆栈跟踪:
java.net.SocketException: already bound
at java.net.DatagramSocket.bind(Unknown Source)
at runner.main(runner.java:16)
最佳答案
我不想恢复旧线程,但我不认为这个问题的答案是正确的。当我使用类似的代码创建 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
不是因为有另一个进程占用同一个端口,而是因为我在使用默认构造函数时创建了一个已经绑定(bind) 的数据报套接字。
new DatagramSocket()
根据 javadoc :
DatagramSocket() Constructs a datagram socket and binds it to any available port on the local host machine.
所以出现异常的原因是您正在尝试绑定(bind)一个已经绑定(bind)的套接字。要使其工作,您需要使用以下构造函数创建一个未绑定(bind)的套接字
DatagramSocket socket = new DatagramSocket(null);
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);
希望这有助于...
关于java - Java接收UDP数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13374239/