Java Android设备未接收多播包

Java Android设备未接收多播包,java,android,networking,Java,Android,Networking,我正在开发一个聊天应用程序,Android客户端将使用多播(UDP)交换IP 每个设备将在一个单独的线程中将其ip发送到多个客户端(运行此应用程序的所有设备)。将有另一个接收器线程侦听这些多播数据包。这是我的密码 //多播代码 DatagramSocket socket = new DatagramSocket(9898); byte buff[] = ip.getBytes(); DatagramPacket packet = new Datag

我正在开发一个聊天应用程序,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
任何帮助都将不胜感激

您需要在应用程序中获取一个,这将允许您的应用程序接收未在网络上明确发送到此设备的数据包

所需许可:

<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"/>

在android中实现了IPv4多播支持。纸杯蛋糕时代的虫子依然存在

我在做一个依赖MDN/多播进行服务发现的项目时遇到了类似的问题。我的Android应用程序根本不会订阅多播组。我通过在Ubuntu14.04机器上创建一个便携式访问点并在其上运行tcpdump来验证这一点。连接到它的Android设备根本不会发出加入群组所需的IGMP消息。我可以发送数据包,但不能接收它们

我注意到,每当我加入网络时,所有系统都会收到一条IPv6加入组消息。这促使我尝试一个IPv6多播地址,并且成功了

较新的android设备支持IPv6,IPv6具有内置和强制多播支持。因此,不要使用第4类IPv4多播地址,而是修改代码以使用IPv6地址。这将使您的代码至少在本地级别上工作

本页面提供了大量关于根据您的需要使用哪个IP的信息

有人说它在没有WiFiManager.crrateMulticastLock()的情况下工作,但我没有尝试

从理论上讲,多播到全球网络当然是可能的。但我从未见过一个成功的实际实现。考虑到存在于世界各地的神秘路由器和防火墙

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


看起来这只适用于wifi多播数据包。我在互联网上进行多播(使用普通APN,无WIFI)。它还能用吗?我认为在Android上不可能,看看答案是否有用。@ShashankKadne,我最近回顾了我的一个项目,它使用JmDNS进行一些多播操作。演示版本自发布模拟mdns服务并在设备上检测它。我忘了我曾经在3G网络下测试和运行过很多次。我刚刚仔细检查了行为,现在可以确认
WifiManager。MulticastLock
在3G网络下工作(无论WIFI是否打开/关闭,3G在状态栏中处于活动状态)。请尝试一下,让我知道这是否也适用于您的终端。正如您所看到的,我的演示应用程序在同一网络中自行创建并检测模拟mdns服务(无论3G或WIFI)。在您的情况下,如果mdns数据包(说是从另一个网络发出的)在您的手机网络中是可访问的(可能需要一些路由),它应该会按预期工作。(+1)谢谢@yorkw。我会尝试让您知道。
// 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;
}