java - 通过 LAN 将 DatagramPacket 从一台 PC 发送到另一台 PC

标签 java networking udp

我希望对等点能够通过 WIFI LAN 发送数据报包,其唯一目的是发现其他对等点。因此,我让每个对等点由一个客户端(发送数据包)和一个服务器(监听数据包)组成。

我只能通过在每台计算机上使用 IPConfig 来获取各自的 IPv4 地址,然后将其用作创建 DatagramPacket 的参数来使其工作:-

InetAddress server = InetAddress.getByName("THE IPv4 ADDRESS OF THE PEER'S SERVER
                                            RUNNING ON THE OTHER MACHINE");

DatagramPacket sendPacket = new DatagramPacket(outBuffer, outBuffer.length,
                                               server, serverPort);

我在这里是否以正确的方式使用广播(用于对等发现),因为如果我这样做,对我来说似乎很垃圾?我假设我可以让机器 A 上的客户端向 LAN 深渊发射一个数据包,而机器 B 上运行的服务器将监听整个 LAN 并检测该数据包。目前,我所做的就是在运行服务器的计算机上手动使用 IPConfig,并在运行客户端的计算机上的 DatagramPacket 中键入该地址,这似乎毫无意义。

我可以很好地使用多播,但我认为广播更适合对等发现。

感谢帮助。

最佳答案

这并不是真正的广播,因为您提供的是服务器的地址,而不是广播地址(255.255.255.255,或任何您的本地网络广播地址(例如192.168.1.255) ,如果您的网段是 192.168.1.0/24)。

您还可能认为您的防火墙可能会阻止服务器端口上传入的 UDP 数据包。您应该查看 DatagramSocket/DatagramPacket 的文档,看看是否有正确绑定(bind)服务器套接字或从客户端正确发送数据包的魔法。

[编辑:如何查找网络广播] 一旦知道网络地址,就可以找到网络广播地址,这两个地址都可以从您的 IP 和子网掩码中得知。子网掩码基本上显示了地址中有多少是网络,有多少是客户端。 (子网掩码通常写为“netmask”)示例:

IP:192.168.1.101 网络掩码:255.255.255.0 网络地址(CIDR):192.168.1.0/24 广播地址:192.168.1.255

或者:

IP:10.13.28.55 网络掩码:255.255.0.0 网络:10.13.0.0/16 广播地址:10.13.255.255

本质上,网络地址末尾有一堆零,广播地址用 1 替换它们。

IPv4 地址是 32 位数字(最容易将其视为无符号。如果您对地址和网络掩码进行按位与,您将获得网络地址。如果您将其与按位非进行按位或的网络掩码,您将获得广播地址(因此 (addr & netmask) | ~netmask) 将获得本地广播)。

255.255.255.255(或0xFFFFFFFF)是全局广播地址。 IP 广播不跨网段,因此发送到它是安全的。

关于java - 通过 LAN 将 DatagramPacket 从一台 PC 发送到另一台 PC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13036349/

相关文章:

java - 可能因不同原因而失败的方法的标准模式是什么?

java - 在测试运行完成后生成 Android JUnit 测试用例的结果

c++ - 关闭调用后,如何在 UDP recvfrom() 调用中获取返回值 0?

linux - 将串行端口重定向到文件但一次只有 1(最后)行的最简单方法?

android - Android Service在后台数据丢失时运行

java - org.apache.commons.io.FilenameUtils 和 Selenium 3.6.0

java - Guice - 没有绑定(bind)实现(对于 List<String>)

javascript - 如何从网页读取并运行硬盘上的文件?

python - 使用给定的 TTL 伪造数据包 UDP

c# - 简单的网络帮助 (C# WinForms)