java - Java接收UDP数据

标签 java sockets networking udp

我正在尝试接收 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/

相关文章:

java - 请放心 -给定()或何时()中的body()

java - 在 Eclipse 中无法解析为变量错误,在另一个类中使用枚举变量

c++ - 我应该使用 AcceptEx() 还是 WSAAccept()?

java - 从其他线程更新 Swing GUI

c++ - 使用数据包套接字在同一网络接口(interface)上发送和接收时无法接收数据包

java - EclipseLink:如何避免嵌套左连接的额外 sql 查询

java - 为 Java 定制 --module-path

c# - 具有多个客户端的 TCP 服务器

networking - 一台服务器拥有多个IP的目的是什么?

c++ - 有没有一种方法可以在不使用库的情况下序列化 C++ 类?