首页 > 解决方案 > 在 Java 中使用 UDP 广播

问题描述

我一直在努力理解使用 UDP 进行广播并且无法在我的程序中实现它。

目前,我有一个客户端和服务器,它们都运行 2 个线程(一个用于接收,一个用于发送)。

客户端可以向它连接的服务器发送 SET/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。

连接端口 = 此客户端连接到的服务器端口

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 的构造函数,我只是要求用户输入他们想要连接的端口号。然后我启动接收线程并将“客户端”发送到服务器,这样它将“注册”客户端。

我关于广播的问题:

我什至使用什么地址?哪个港口?

标签: javaudpbroadcast

解决方案


您想要的在技术上称为“多播”,而不是“广播”。它允许一个或多个服务器注册一个多播地址,客户端可以向该地址发送消息。

客户端和服务器都创建一个MulticastSocket。您需要在 224.xxx 空间中选择一个端口号和一个多播地址;224.0.0.1 可能是合适的,虽然我已经有一段时间没有这样做了,所以我可能有点生疏了。您还可以为您的特定用途选择一个“未使用”的 224 地址。

多播和广播之间的区别在于广播是“所有人”,包括随机路由器、网络摄像头等,它们并不关心您的应用程序。广播访问往往是一种特权操作。广播地址在您的网络中是全一。所以,如果你的网络是 192.168.1.0/24,那么广播地址就是 192.168.1.255。


推荐阅读