在 Java 中使用 UDP 进行广播
Broadcasting with UDP in Java
我一直在努力理解使用 UDP 进行广播,但未能在我的程序中实现它。
目前,我有一个客户端和服务器,它们都有 运行 2 个线程(一个用于接收,一个用于发送)。
客户端可以向其连接的服务器发送 SET/GET 查询,发送到 store/get 键值对。
这个想法是,对于多个服务器,我们正在寻找的密钥可能在另一台服务器上。因此 GET 查询应该广播到所有其他服务器。
private void send(String value, int port) throws IOException {
System.out.println("Send: " + value);
byte[] buffer = (value).getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, connectingPort);
socket.send(packet);
}
这是当前客户端发送线程的发送函数。
作为 InetAddress,我使用 localhost。
connectingPort = 此客户端连接到的服务器的端口
public ClientSendingThread() throws UnknownHostException, SocketException {
address = InetAddress.getByName("localhost");
stdin = new BufferedReader(new InputStreamReader(System.in));
//Registering yourself upon creation
try {
socket = new DatagramSocket();
socket.setBroadcast(true);
receiver = new ClientReceivingThread(socket);
System.out.println("Enter port of the Server you would like to connect to: ");
System.out.println("localhost is used automatically as address");
connectingPort = Integer.parseInt(stdin.readLine());
Thread receivingThread = new Thread(receiver);
receivingThread.start();
send("Client", connectingPort);
} catch (IOException ex) {
System.out.println(ex);
}
}
这是 ClientSendingThread 的构造函数,我只是要求用户输入他们想要连接到的端口号。然后我启动接收线程并将“客户端”发送到服务器,这样它将“注册”客户端。
我关于广播的问题:
我什至使用什么地址?哪个港口?
您想要的在技术上称为 'multicast',而不是 'broadcast'。它允许一个或多个服务器注册一个多播地址,客户端可以向该地址发送消息。
客户端和服务器都在224.x.x.xspace中创建一个MulticastSocket. You'll need to pick a port number and a multicast address; 224.0.0.1 可能是合适的,虽然我已经有一段时间没有这样做了,所以我可能有点生疏。您也可以选择一个 'unused' 224 地址用于您的特定用途。
多播和广播的区别在于广播是'everyone',包括随机路由器,网络摄像头等,真正不关心你的应用。广播访问往往是一种特权操作。广播地址在您的网络中是全一的。所以,如果你的网络是192.168.1.0/24,那么广播地址就是192.168.1.255.
我一直在努力理解使用 UDP 进行广播,但未能在我的程序中实现它。
目前,我有一个客户端和服务器,它们都有 运行 2 个线程(一个用于接收,一个用于发送)。
客户端可以向其连接的服务器发送 SET/GET 查询,发送到 store/get 键值对。 这个想法是,对于多个服务器,我们正在寻找的密钥可能在另一台服务器上。因此 GET 查询应该广播到所有其他服务器。
private void send(String value, int port) throws IOException {
System.out.println("Send: " + value);
byte[] buffer = (value).getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, connectingPort);
socket.send(packet);
}
这是当前客户端发送线程的发送函数。
作为 InetAddress,我使用 localhost。
connectingPort = 此客户端连接到的服务器的端口
public ClientSendingThread() throws UnknownHostException, SocketException {
address = InetAddress.getByName("localhost");
stdin = new BufferedReader(new InputStreamReader(System.in));
//Registering yourself upon creation
try {
socket = new DatagramSocket();
socket.setBroadcast(true);
receiver = new ClientReceivingThread(socket);
System.out.println("Enter port of the Server you would like to connect to: ");
System.out.println("localhost is used automatically as address");
connectingPort = Integer.parseInt(stdin.readLine());
Thread receivingThread = new Thread(receiver);
receivingThread.start();
send("Client", connectingPort);
} catch (IOException ex) {
System.out.println(ex);
}
}
这是 ClientSendingThread 的构造函数,我只是要求用户输入他们想要连接到的端口号。然后我启动接收线程并将“客户端”发送到服务器,这样它将“注册”客户端。
我关于广播的问题:
我什至使用什么地址?哪个港口?
您想要的在技术上称为 'multicast',而不是 'broadcast'。它允许一个或多个服务器注册一个多播地址,客户端可以向该地址发送消息。
客户端和服务器都在224.x.x.xspace中创建一个MulticastSocket. You'll need to pick a port number and a multicast address; 224.0.0.1 可能是合适的,虽然我已经有一段时间没有这样做了,所以我可能有点生疏。您也可以选择一个 'unused' 224 地址用于您的特定用途。
多播和广播的区别在于广播是'everyone',包括随机路由器,网络摄像头等,真正不关心你的应用。广播访问往往是一种特权操作。广播地址在您的网络中是全一的。所以,如果你的网络是192.168.1.0/24,那么广播地址就是192.168.1.255.