我实际上想做的是通过wifi广播一条消息(假设其他手机上运行着我创建的应用程序,但我还不知道它的IP)所以该应用程序在收到该消息时,会通过wifi返回一条带有该设备IP的消息,我在理想的情况下考虑这个场景,两台设备都运行着我创建的同一个应用程序,只是想添加通过wifi向其他设备广播消息的功能,这可能吗?
我用Java创建了这个演示程序。每个主机(Android设备)都将运行客户端和服务器代码。客户端不断在多播地址上发布其IP地址,所有其他设备都在侦听并跟踪它。同一设备也是同一多播地址的侦听器,因此他可以在其他Android发送数据包时发现它们。请注意,此体系结构的资源使用量非常大,而且根本无法扩展。我写这个只是为了玩数据报,它似乎也是最接近你的问题的答案
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class Main {
public static final int PORT = 2345;
public static final String MULTICAST = "224.0.0.99";
/*
* A simple server that prints the name of the first
* device discovered and then terminates
*/
static class Server extends Thread{
@Override
public void run() {
try {
MulticastSocket socket = new MulticastSocket(PORT);
InetAddress group = InetAddress.getByName(MULTICAST);
socket.joinGroup(group);
byte[] buf = new byte[256];
// receive request
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
System.out.printf("SERVER receives: %s", new String(packet.getData()));
socket.leaveGroup(group);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
* This client send own IP address to all machines
* listening on MULTICAST
*/
static class Client extends Thread{
@Override
public void run() {
try {
MulticastSocket socket = new MulticastSocket();
socket.setBroadcast(true);
byte[] buffer = "I'm a new client. My IP is XXX.XXX.XXX.XXX".getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(MULTICAST), PORT);
socket.send(packet);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
new Server().start();
Thread.sleep(1000); // Make sure server started
new Client().start();
}
}
关于Android部分,您需要android.permission.CHANGE_WIFI_MULTICAST_STATE
权限,因为打包的多播被Android堆栈过滤掉,所以您将使用WifiManager.MulticastLock
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
multicastLock.acquire();
几天前我就在想这个问题。我的结论是,你不能在设备的IP上中继,因为他们可以通过DHCP获得它,而且它每次都会改变。因此,一种非常简单的方法是发送电子邮件中附带的数据并将其发送给接收者。
您必须实现一个解析器,它可以读取数据(假设它是在XML文件中编写的),并在接收器上执行您需要的操作。要实现这一点,您必须注册正确的组件(活动),以响应传输的文件类型的Intent ACTION_VIEW,例如XML。
希望它能有所帮助!