Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_Sockets_Network Programming_Udp_Broadcast - Fatal编程技术网

什么';在Java中广播UDP数据包的正确方法是什么?

什么';在Java中广播UDP数据包的正确方法是什么?,java,sockets,network-programming,udp,broadcast,Java,Sockets,Network Programming,Udp,Broadcast,我需要在每个网络接口上广播一个UDP数据包。起初,我试着广播到255.255.255.255,但没有结果,后来我发现这个“已经被弃用了大约20年”。因此,我尝试迭代每个网络接口,以获得接口的广播地址,然后向该地址发送UDP数据包 不过,下面的代码: public static Collection<InetAddress> getBroadcastAddresses() { try { Collection<InetAddress> result

我需要在每个网络接口上广播一个UDP数据包。起初,我试着广播到
255.255.255.255
,但没有结果,后来我发现这个“已经被弃用了大约20年”。因此,我尝试迭代每个网络接口,以获得接口的广播地址,然后向该地址发送UDP数据包

不过,下面的代码:

public static Collection<InetAddress> getBroadcastAddresses() {
    try {
        Collection<InetAddress> result = new LinkedList<InetAddress>();
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
                for (InterfaceAddress address : netint.getInterfaceAddresses()) {
                    InetAddress broadcastAddress = address.getBroadcast();
                    if (broadcastAddress != null)
                        result.add(broadcastAddress);
                }
        return result;
    } catch (SocketException e) {
        throw new RuntimeException(e);
    }
}

public static void broadcast(int port, DatagramPacket packet,
        DatagramSocket socket, PrintWriter logger) throws IOException {

    packet.setPort(port);

    for (InetAddress address : getBroadcastAddresses()) {
        logger.println("Broadcasting to: "+address);
        packet.setAddress(address);
        socket.send(packet);
    }
    
}
这真的很烦人。我是否应该获取每个网络接口的IP地址和网络掩码,并执行按位操作以“构建”正确的广播地址。。。是否有一种干净的Java方式可以将一个糟糕的UDP数据包整齐地传递给我网络中的所有好友


编辑:搜索网页,结果发现这次我的代码没有被破坏。相反,JVM是。您从
InterfaceAddress.getBroadcast()
获取的数据不一致,至少在Windows 7下是这样。请参阅示例和:解决方案似乎设置了一个Java系统属性,以使其更喜欢IPv4而不是IPv6,但这对我不起作用。即使使用建议的解决方法,我在每次不同的运行中都会得到不同的结果,而且由于我得到的广播地址显然是随机的,我怀疑我收到的数据来自未定义的状态内存位置。

您需要获得网络IP并标记,然后将其用于广播。这是最简单的部分。然后,您需要收集所有回复,知道某些服务器可能没有收到UDP数据包,并且某些回复可能已丢失。您必须考虑到UDP被设计为不可靠的事实


我将直接解析ipconfig/all以获取IP和子磁盘。即使ipconfig也只有IPv4的子掩码

,其设计也不可靠。不完全一样。我接受UDP的不可靠性。这不是问题的重点,不过…:)我在问是否有比使用IP地址和网络掩码更好的方法。@EJP,我以为它是为了在负载下丢弃数据包而设计的。但是,我不知道设计中是否提到了这一点。@gd1,简而言之,没有。我能想到的所有替代方案也要求您了解接口信息,并且可能更复杂。广播UDP用于您似乎要执行的任务。@PeterLawrey IP用于丢弃数据包。UDP只是继承了这一点,与TCP不同,它不做任何事情。
Broadcasting to: /0.255.255.255
Broadcasting to: /255.255.255.255
Broadcasting to: /255.255.255.255
Broadcasting to: /255.255.255.255
Broadcasting to: /255.255.255.255