我正在使用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,则创建一个未绑定的套接字。