我正在使用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类在Java中实现类似的客户端,但是我不断收到“地址已在使用中”错误。显然,我需要以不同于当前的方式构建它:

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的第二段中:


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

10-04 22:01