当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Java中广播UDP数据包的正确和有效方法是什么?》经验,为你挑选了0个好方法。

我需要在每个网络接口上广播UDP数据包.起初,我尝试广播255.255.255.255,但没有结果,后来我发现这个"已被弃用了大约20年".因此,我尝试在每个网络接口上进行迭代,以获取接口的广播地址,然后将UDP数据包发送到该地址.

仍然,以下代码:

public static Collection getBroadcastAddresses() {
    try {
        Collection result = new LinkedList();
        Enumeration 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地址和网络掩码,并执行按位操作以"构建"正确的广播地址?在我看来,这就像C中的Unix套接字编程一样 ......是否有一种干净的Java方式可以巧妙地将所有可疑的UDP数据包传递给拥挤我的网络的所有好友?

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

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

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有