微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Java中广播UDP数据包的正确和有效方法是什么?

我需要在每个网络接口上广播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);
    }

}

打印这个东西:

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

这真的很烦人.我是否应该为每个网络接口获取IP地址和网络掩码,并执行按位操作以“构建”正确的广播地址? This seems to me like Unix socket programming in C …是否有一种干净的Java方式可以巧妙地将可怜的UDP数据包传递给所有聚集我的网络的好友?

编辑:在网上搜索,结果发现这次我的代码没有被破坏.相反,JVM是.您从InterfaceAddress.getbroadcast()获得的数据是不一致的,至少在Windows 7下是这样.请参阅例如thisthis解决方案似乎设置了Java系统属性,以使其更喜欢IPv4 over IPv6,但这不是为我工作.即使有建议的解决方法,我在每次不同的运行中得到不同的结果,并且因为我得到的广播地址显然是随机的,我怀疑我从未定义的状态存储器位置获取数据.认真,严肃……

InterfaceAddress实现已中断.现在我遇到了一个很大的问题,因为我不知道如何开发这个网络应用程序. IP多播广泛不受支持.我只想在没有用户将其写在文本字段上的情况下向正确的UDP广播地址广播一些垃圾.

解决方法

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

我会直接解析ipconfig / all来获取IP和子掩码.甚至ipconfig也只有IPv4的子掩码

原文地址:https://www.jb51.cc/java/129002.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐