我真正想要做的是通过wifi广播一条消息(假设其他单元格已经运行了我已创建的应用程序,但我还不知道它的IP)所以当应用程序收到该消息时它返回通过wifi返回带有该设备的IP的消息,我正在考虑这种情况,在理想状态下,两个设备都运行相同的应用程序我创建只是想添加功能,通过wifi向其他设备广播消息,是吗可能或如何?
答案 0 :(得分:3)
我用Java创建了这个演示程序。每个主机(Android设备)都将运行客户端和服务器代码。客户端在多播地址上不断发布其IP地址,其中所有其他设备正在侦听并跟踪它。同一个设备也是同一个多播地址的监听器,因此他可以在发送数据包时发现其他Androids。请注意,此体系结构在资源使用方面非常繁重,并且根本无法扩展。我只是用这个来编写数据报,它似乎也是你问题的最接近的答案
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();
答案 1 :(得分:1)
几天前我正在考虑这个问题。我的结论是你无法在设备的IP上进行中继,因为他们可以通过DHCP获取它,并且它可以随时更改。因此,一种非常简单的方法是发送附在电子邮件中的数据并将其发送给接收方。
您必须实现一个可以读取数据的解析器(假设它是用XML文件编写的)并在接收器上执行您需要的操作。要实现这一点,您必须注册正确的组件(Activity)以响应您传输的文件类型的Intent ACTION_VIEW,例如XML。
希望它有所帮助!