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.
我正在使用 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.