我正在开发一款聊天应用程序,其中安卓客户端将使用多播(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
任何帮助都将不胜感激。
WifiManager.MulticastLock
在3G网络下工作(无论WIFI是否打开/关闭,在状态栏中激活3G)。请尝试一下,让我知道这在你那边是否有效。 - yorkwMulticastLock
。然而,由于Android 12,我现在发现我至少需要这样做(在Android 12 Beta 4上)。 - Columbo