我已经写了一个基本代码来使用这个链接在java中从一个Windows机器组播UDP数据包。 接收器是几个Android手机,运行在同一链接给出的接收器代码。
这是发件人代码:
int mcPort = 4446; String mcIPStr = "225.4.5.6"; InetAddress group = InetAddress.getByName(mcIPStr); DatagramSocket udpSocket = new DatagramSocket(); byte[] c = "SENT".getBytes(); DatagramPacket packet = new DatagramPacket(c, c.length, group, mcPort); udpSocket.send(packet); udpSocket.close();
这里是接收器代码:
int mcPort = 4446; MulticastSocket mcSocket = new MulticastSocket(mcPort); InetAddress group = InetAddress.getByName("225.4.5.6"); mcSocket.joinGroup(group); DatagramPacket packet = new DatagramPacket(new byte[PACKET_SIZE],PACKET_SIZE); mcSocket.receive(packet); byte[] data = packet.getData(); String msg = new String(data); System.out.println("message:"+msg);
当Windows机器连接到与接收机节点相同的wifi时,数据包被正确接收。 但是我想在没有外部wifi的情况下实现相同的function。
所以我configuration我的Windows机器作为接入点使用此链接 。 节点现在连接到这个AP。 根据我的理解,节点现在应该接收数据包,但他们不!
我错过了什么?
啊,这样的痛苦。 多播路由是微妙的。
作为AP运行的PC对大多数Wifi驱动程序来说都是一个奇特的用例。 某些Wifi驱动程序仅在AP模式下提供有限的功能。 也许你的驱动程序根本不支持多播,也可能只是没有为多播设置默认路由。
事情你可以检查和尝试:
您是否通过正确的网络接口发送组播数据包? 当您处于AP模式时,默认的网络接口可能不再是正确的。 我看不到您的发件人代码中显式绑定到网络适配器的位置。 令人困惑的是,这通常是通过Windows(以及Linux)上的IP地址来完成的,尽管还有其他(非标准的)替代方案。
尝试将发件人放到不同的Windows PC上,并将其连接到作为AP运行的Windows PC。 现在有效吗? 那么只是组播包的本地路由被搞乱了。
Wireshark在本地环回设备上说什么? (你必须安装npcap才能得到一个回送设备,但这对于诊断这样的问题是非常有用的,看看本地发生了什么。)
本地接收(在AP上运行)接收到什么内容?