Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的UDP广播_Java_Udp_Broadcast - Fatal编程技术网

Java中的UDP广播

Java中的UDP广播,java,udp,broadcast,Java,Udp,Broadcast,我一直在努力理解UDP广播,但还不能在我的程序中实现它 目前,我有一个客户端和服务器,都运行2个线程(一个用于接收,一个用于发送) 客户端可以向其连接的服务器发送SET/GET查询,以存储/获取键值对。 我们的想法是,对于多台服务器,我们正在寻找的密钥可能位于另一台服务器上。因此,GET查询应该广播到所有其他服务器 private void send(String value, int port) throws IOException { System.out.println("

我一直在努力理解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

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

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

我对广播的问题:


我用什么地址?哪个端口?

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

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


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

本地主机发送UDP数据报不属于广播。你必须发送到一个广播地址,而你不是。但是您应该为此使用多播,而不是广播。您没有通过UDP协议“连接”到任何内容。有关可用和保留的多播地址,请参阅。