UDP广播客户端在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()

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

我试图在Java中使用DatagramSocket类实现类似的客户端,但我一直得到一个"地址已经在使用"的错误。显然,我需要以不同于当前的方式构建它:

DatagramSocket socket = new DatagramSocket(broadcastPort);

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

试试这个:

// 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));

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

如果地址为空,创建一个未绑定的套接字。

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

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

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

编辑:使用 MulticastSocket

相关内容

最新更新