Android 如何获取其他移动设备的IP地址?

Android 如何获取其他移动设备的IP地址?,android,Android,我实际上想做的是通过wifi广播一条消息(假设其他手机上运行着我创建的应用程序,但我还不知道它的IP),这样应用程序在收到该消息时,会通过wifi返回一条带有该设备IP的消息,我在理想情况下考虑这个场景,两台设备都在运行我创建的同一个应用程序,只是想添加通过wifi向其他设备广播消息的功能,这是可能的还是如何实现的?几天前我就在想这个问题。我的结论是,您不能在设备的IP上中继,因为他们可以通过DHCP获得它,并且每次都可以更改。因此,一种非常简单的方法是将附加在电子邮件中的数据发送给接收者 您必

我实际上想做的是通过wifi广播一条消息(假设其他手机上运行着我创建的应用程序,但我还不知道它的IP),这样应用程序在收到该消息时,会通过wifi返回一条带有该设备IP的消息,我在理想情况下考虑这个场景,两台设备都在运行我创建的同一个应用程序,只是想添加通过wifi向其他设备广播消息的功能,这是可能的还是如何实现的?

几天前我就在想这个问题。我的结论是,您不能在设备的IP上中继,因为他们可以通过DHCP获得它,并且每次都可以更改。因此,一种非常简单的方法是将附加在电子邮件中的数据发送给接收者

您必须实现一个解析器,该解析器可以读取数据(假设数据写在XML文件中),并在接收器上执行您需要的操作。要实现这一点,您必须注册正确的组件(活动),以响应您传输的文件类型的意向操作视图,例如XML


希望有帮助

几天前我就在想这件事。我的结论是,您不能在设备的IP上中继,因为他们可以通过DHCP获得它,并且每次都可以更改。因此,一种非常简单的方法是将附加在电子邮件中的数据发送给接收者

您必须实现一个解析器,该解析器可以读取数据(假设数据写在XML文件中),并在接收器上执行您需要的操作。要实现这一点,您必须注册正确的组件(活动),以响应您传输的文件类型的意向操作视图,例如XML


希望有帮助

我用Java创建了这个演示程序。每个主机(Android设备)将同时运行客户端和服务器代码。客户端在多播地址上连续发布其IP地址,所有其他设备都在侦听并跟踪该地址。同样的设备也是同一个多播地址上的侦听器,因此他可以在其他机器人发送数据包时发现它们。请注意,这种体系结构占用大量资源,根本无法扩展。我写这篇文章只是为了处理数据报,它似乎也是最接近你问题的答案

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\u WIFI\u MULTICAST\u STATE
,因为多播打包被Android堆栈过滤掉,所以您将使用


我用Java创建了这个演示程序。每个主机(Android设备)将同时运行客户端和服务器代码。客户端在多播地址上连续发布其IP地址,所有其他设备都在侦听并跟踪该地址。同样的设备也是同一个多播地址上的侦听器,因此他可以在其他机器人发送数据包时发现它们。请注意,这种体系结构占用大量资源,根本无法扩展。我写这篇文章只是为了处理数据报,它似乎也是最接近你问题的答案

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\u WIFI\u MULTICAST\u STATE
,因为多播打包被Android堆栈过滤掉,所以您将使用


听起来你想为iPhone做一些类似“你好”的服务,你有没有检查过这个问题?听起来你想为iPhone做一些类似“你好”的服务,你有没有检查过这个问题?好吧,我应该为当地大学的wifi设计它,在那里我们(大多数时候)有来自分配给连接设备的路由器的静态IP。我只是想知道我们在wifi上聊天时发送信息的方式。好的!所以你是在一个封闭的环境中工作!这改变了情景。然后,我认为你应该做一些事情,比如使用TCP数据包,并为客户端/服务器端编程……好吧,我应该为本地大学的wifi设计它,在那里(大多数时候)我们有来自分配给连接设备的路由器的静态IP。我只是想知道我们在wifi上聊天时发送信息的方式。好的!所以你是在一个封闭的环境中工作!这改变了情景。然后,我认为您应该做一些事情,比如使用TCP数据包,并编写客户端/服务器端的程序。。。