Java 中的 UDP 广播客户端

UDP broadcast client in Java

我正在使用 UDP 广播进行服务间通信服务器在 Python 中,我可以使用以下代码查看 UDP 消息:

import sys
import socket

HOST = ''
PORT = 9002

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
s.bind((HOST,PORT))

while True:
    try:
        message = s.recv(8192)
        print("Got data: " + message)
    except KeyboardInterrupt:
        sys.exit()

我可以在同一台机器上同时 运行 任意数量的客户端。

我正在尝试使用 DatagramSocket class 在 Java 中实现类似的客户端,但我一直收到 "address already in use" 错误。显然我需要以不同于现在的方式构建它:

DatagramSocket socket = new DatagramSocket(broadcastPort);

是否可以获得与 Python 代码相同的行为?

地址已在使用可能意味着您没有正确终止您的程序。如果您使用的是 Eclipse,请确保检查所有打开的控制台并终止它们。 (右上角,蓝色框 - 单击它,它将显示所有 运行 个程序)

在 Eclipse 中,仅仅因为您再次 "run" 您的程序,它不会终止前一个程序。

另一个可能的问题是您可能使用与 python 服务器相同的端口。 2 应用程序不能声明同一个端口,如果是这样,只需更改端口号即可。

编辑:使用MulticastSocket.

试试这个:

// create an unbound socket
DatagramSocket socket = new DatagramSocket(null);

// make it possible to bind several sockets to the same port
socket.setReuseAddress(true);

// might not be necessary, but for clarity
socket.setBroadcast(true);

socket.bind(new InetSocketAddress(9002));

构造函数的空参数是这里的关键。这种智慧隐藏在 DatagramSocket(SocketAddress bindAddress) 构造函数的 javadoc 的第二段中:

if the address is null, creates an unbound socket.