【发布时间】:2020-07-18 15:25:25
【问题描述】:
好的,所以我的应用程序是一个点对点聊天应用程序,专为 LAN 通信而设计。发现是通过 UDP 在 UDP 广播地址 (255.255.255.255) 广播 ip 和端口来完成的。我在测试时同时在三个平台上运行它:ubuntu(通过 VirtualBox 的 VM,它通过 VirtualBox Host-Only Ethernet Adapter 连接到网络)、windows 10(我的开发平台,并且“直接”连接到“主”网络,我的路由器,通过我的 wifi 网络适配器),以及在 android 上,它也“直接”连接。
Desktop 和 Ubuntu 共享完全相同的 jar 可执行文件,android 共享相同的网络模型,负责在网络上寻找对等点并建立连接,以及在启动时广播客户端。
我再说一遍,我运行它的三个平台共享完全相同的网络。
但是,当我首先从 android 和/或 VM 运行我的应用程序,然后在 windows 10 上运行我的应用程序时,我发现 windows 客户端不会在广播地址上广播自己,这一点在我后来使用 wireshark 的测试中得到证实. Android 和 VM 将在广播地址上显示为广播,而 Windows 10 不会。
创建发送和接收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_PORT 是 13100。
另外,这些是来自 WireShark 的结果(隐藏了我的 IP 以保护我的隐私):
android 和 VM 都正确广播,并且我手动检查了我使用的是正确的适配器(我在 Windows 上使用我的 wifi 适配器)。
任何线索和帮助我为什么不从 windows 广播,而从其他两个平台很好会很棒。提前致谢!
【问题讨论】:
-
广播是一种陈旧的、已弃用的做事方式。广播会中断 LAN 上的每个主机,包括不感兴趣的主机(路由器、打印机等),并且会浪费带宽。这就是为什么从 IPv6 中消除了广播,因此您的应用程序无法移植到 IPv6。现代的方法是使用多播,它只会中断对接收多播感兴趣的主机。广播无法路由,但我们有组播路由(与单播路由非常不同),因此也可以路由组播。
-
@RonMaupin 您能否将我重定向到一个资源以开始使用,以便我可以在应用程序正式发布之前将应用程序的网络部分移植到多播?谢谢你的信息!
标签: java networking udp cross-platform broadcast