我正在使用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代码相同的行为?
答案 0 :(得分:4)
试试这个:
// 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,则创建未绑定套接字。
答案 1 :(得分:1)
已使用的地址可能意味着您未正确终止您的计划。如果您正在使用Eclipse,请确保检查所有打开的控制台并终止所有控制台。 (右上角,蓝色框 - 单击它,它将显示所有正在运行的程序)
在Eclipse中,只是因为你再次“运行”你的程序,它不会终止前一个程序。
另一个可能的问题是您可能使用与python服务器相同的端口。 2应用程序无法声明相同的端口,因此只需更改端口号即可。
修改:使用 MulticastSocket
。