在 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.