Java 为什么';windows桌面广播UDP?

Java 为什么';windows桌面广播UDP?,java,networking,udp,cross-platform,broadcast,Java,Networking,Udp,Cross Platform,Broadcast,好的,我的应用程序是一个点对点聊天应用程序,设计用于局域网通信。发现通过UDP广播ip和端口在UDP广播地址(255.255.255.255)处完成。测试时,我同时在三个平台上运行它:ubuntu(虚拟机通过VirtualBox,它通过VirtualBox主机专用以太网适配器连接到网络)、windows 10(我的开发平台,通过我的wifi网络适配器“直接”连接到“主”网络、我的路由器)和android,在android上它“直接”连接还有 桌面和Ubuntu共享完全相同的jar可执行文件,an

好的,我的应用程序是一个点对点聊天应用程序,设计用于局域网通信。发现通过UDP广播ip和端口在UDP广播地址(255.255.255.255)处完成。测试时,我同时在三个平台上运行它:ubuntu(虚拟机通过VirtualBox,它通过VirtualBox主机专用以太网适配器连接到网络)、windows 10(我的开发平台,通过我的wifi网络适配器“直接”连接到“主”网络、我的路由器)和android,在android上它“直接”连接还有

桌面和Ubuntu共享完全相同的jar可执行文件,android共享相同的网络模型,负责在网络上查找对等点并建立连接,以及在启动时广播客户端

我要再次指出,我运行它的三个平台共享完全相同的networker。

然而,当我先从android和/或VM运行我的应用程序,然后在windows 10上运行时,我发现windows客户端不会在广播地址上广播自己,我后来用wireshark进行的测试证实了这一点。Android和VM将在广播地址上显示为广播,而Windows10则不会

创建发送和接收UDP广播的广播套接字的代码如下所示,它由一个特定线程处理,没有其他线程可以访问:

public FindPeersBroadcasterRunnable() {
        try {
            broadcastSocket = new DatagramSocket(Constants.UDP_DECLARE_PEERS_PORT);
            broadcastSocket.setBroadcast(true);
            receivePacket = new DatagramPacket(new byte[Constants.MAX_PEER_NOTIFY_LENGTH], Constants.MAX_PEER_NOTIFY_LENGTH);
        } catch (SocketException ex) {
            LOGGER.log(Level.SEVERE, ex.getMessage(), ex);
        }
    }
值得注意的是,Constants.UDP_DECLARE_PEERS_端口是13100

此外,以下是WireShark的结果(隐藏我的IP以保护我的隐私):

安卓和虚拟机都能正常广播,我已经手动检查了我使用的适配器是否正确(我在windows上使用的是wifi适配器)


任何线索和帮助为什么我不从windows播放,而从其他两个平台播放则很好。提前谢谢

最有可能解决的问题是:为了使UDP套接字正确广播,我必须绑定正在使用的适配器地址,例如:

broadcastSocket = new DatagramSocket(Constants.UDP_DECLARE_PEERS_PORT, InetAddress.getByName(IP_HERE));

广播是一种古老的、不受欢迎的做事方式。广播会中断局域网上的每台主机,包括不感兴趣的主机(路由器、打印机等),并浪费带宽。这就是为什么广播已从IPv6中消除,所以您的应用程序无法移植到IPv6。现代的方法是使用多播,它只会中断对接收多播感兴趣的主机。广播无法路由,但我们有多播路由(与单播路由非常不同),因此也可以路由多播。@RonMaupin能否将我重定向到一个资源开始,以便在应用程序正式发布之前将应用程序的网络部分移植到多播?谢谢你提供的信息!在Windows上,广播数据包不会在每个界面上发送。它们仅在主界面上发送。。。我想不起来Windows是如何决定哪一个是。这真是个问题!几十年来一直让我发疯。:-)@布拉德:这真是个问题!谢天谢地,java支持我,我可以显式地声明我想要使用的接口的inetaddress。