我希望对等点能够通过 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/