Android设备未收到组播包

我正在开发一个聊天应用程序,Android客户端将使用多播(UDP)交换他们的IP。

每个设备将在一个单独的线程中将其IP发送到多个客户端(运行该应用程序的所有设备)。 将会有另一个接收器线程监听这些多播数据包。 这是我的代码。

//多播代码

DatagramSocket socket = new DatagramSocket(9898); byte buff[] = ip.getBytes(); DatagramPacket packet = new DatagramPacket(buff, buff.length, InetAddress.getByName("224.0.0.1"),9999); socket.send(packet); socket.close(); 

//接收者代码

 MulticastSocket socket = new MulticastSocket(9999); InetAddress group = InetAddress.getByName("224.0.0.1"); socket.joinGroup(group); DatagramPacket packet; byte[] buf = new byte[256]; byte b = 'x'; //just a separator for time being Arrays.fill(buf,b); packet = new DatagramPacket(buf, buf.length); String received= ""; while(received!=null) { socket.receive(packet); received = new String(packet.getData()); received = received.substring(0,received.indexOf('x')); this.setIp(received); System.out.println("Address: " + received); } socket.leaveGroup(group); socket.close(); 

问题是每个设备都打印自己的地址。 它似乎从来没有听其他组播包(我的意思是它应该打印其他IP的以及)。 我也得到一个下面的日志,不知道这是相关的。

 11-04 23:56:17.985: I/OSNetworkSystem(603): mcastAddDropMembership interfaceIndex=0 

任何帮助将不胜感激。

Solutions Collecting From Web of "Android设备未收到组播包"

您需要在您的应用程序中获取一个MulticastLock ,这将允许您的应用程序接收没有明确指向networking上此设备的数据包。

所需权限:

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

示例代码:

 // Acquire multicast lock WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); multicastLock.setReferenceCounted(true); multicastLock.acquire(); //Do some mutlicast job here ... ... // Once your finish using it, release multicast lock if (multicastLock != null) { multicastLock.release(); multicastLock = null; } 

android中的IPv4组播支持很差。 还有来自蛋糕时代的错误仍然存​​在。

我遇到了一个类似的问题,我正在做一个依靠mDNS /多播进行服务发现的项目。 我的Android应用程序将不会订阅多播组。 我通过在Ubuntu 14.04机器上创build一个便携式访问点并在其上运行tcpdump来validation这一点。 连接到它的Android设备根本不会发送join组所需的IGMP消息。 我可以发送数据包,但没有收到它们。

我注意到,当我joinnetworking时,我正在向所有系统发送IPv6join组消息。 这促使我尝试一个IPv6多播地址,并工作。

较新的Android设备支持IPv6,它具有内置的和强制性的组播支持。 因此,不要使用4类IPv4多点传送地址,而要将代码修改为使用IPv6地址。 这将使你的代码至less在本地工作。

http://developer.android.com/reference/java/net/Inet6Address.html

本页面提供了丰富的关于根据您的需求使用哪个IP的信息。

有人说,它没有WiFiManager.crrateMulticastLock(),但我没有尝试。

从理论上讲,对全球networking进行多播是有可能的。 但我从来没有见过一个成功的实际执行。 考虑到四周存在的深奥的路由器和防火墙。

这个SO问题显示了它是如何在桌面上完成的。 类似的代码也适用于android。

IPv6组播示例