【问题标题】:Android Scan Local SubnetAndroid 扫描本地子网
【发布时间】:2011-02-24 14:57:34
【问题描述】:

我目前正在编写一个小型测试 Android 应用程序,但在模拟器上遇到了一个小(大)问题。

用于扫描本地子网以查找运行我的服务器软件的计算机的代码没有返回任何内容!这段代码在桌面部分运行良好,所以我知道我的模拟器内部有问题。

我必须先对 IP 扫描进行硬编码,因为我无法确定模拟器中的 IP 地址,所以我知道我至少扫描了正确的范围。

总结:如何从本地子网上的模拟器内部通过套接字连接到服务器?

谢谢大家!

这是请求的代码:

public static ArrayList<String> serviceScanner() {
    ArrayList<String> servers = new ArrayList<String>();

    // Get the IP of the local machine
    String iIPv4 = "";
    String test = "";


    //getLocalIpAddress();
    //System.out.println(test);

    try {
        // Get localhost
        InetAddress addr = InetAddress.getLocalHost();

        // Get IP Address
        byte[] ipAddr = addr.getAddress();

        iIPv4 = addr.toString();
        iIPv4 = iIPv4.substring(iIPv4.indexOf("/") + 1);
        iIPv4 = "10.0.2.1";
    } catch (UnknownHostException e) {
        // Exception output
    }
    // IP stuff.
    String IPv4Start = "", IPv4End = "";
    iIPv4 = iIPv4.substring(0, iIPv4.lastIndexOf("."));
    iIPv4 += ".";
    IPv4Start = iIPv4 + "1";
    IPv4End = iIPv4 + "254";


    PrintWriter out = null;
    BufferedReader in = null;

    // Loop to scan each address on the local subnet
    for (int i = 1; i < 255; i++) {

        try {
            System.out.println(iIPv4+i);
            Socket mySocket = new Socket();
            SocketAddress address = new InetSocketAddress(iIPv4 + i, port);

            mySocket.connect(address, 5);

            out = new PrintWriter(mySocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(
                    mySocket.getInputStream()));
            out.println("Scanning!");
            String fromServer;
            while ((fromServer = in.readLine()) != null) {
                System.out.println("Server: " + fromServer);
                if (fromServer.equals("Server here!")) {
                    servers.add(iIPv4 + i);
                    mySocket.close();
                    break;
                }
            }
            mySocket.close();
            out.close();
            in.close();

        } catch (UnknownHostException e) {
        } catch (IOException e) {
        }
    }
    return servers;
}

}

【问题讨论】:

    标签: java android sockets networking emulation


    【解决方案1】:

    模拟器与您的计算机不在同一子网中。它位于自己的虚拟子网上,通过自己的 NAT 路由器连接到计算机。这里有解释:http://developer.android.com/guide/developing/devices/emulator.html#emulatornetworking

    但是,模拟器应该能够通过其路由器连接到 Internet 上任何位置的任何套接字。您尝试连接的地址是什么?模拟器不会路由 10.0.0.0 私有地址,因为它自己使用它们。不确定 168.192.0.0。你能发布失败的代码吗?

    【讨论】:

    • 感谢您的回复。我正在尝试连接到 10.115.23.* 范围内的机器。
    • 这就是为什么 NAT 后面的私有地址很糟糕的原因,最好为每台机器使用公共地址。您有两个网络都使用相同的地址空间。建议: 1. 重新编号您的网络以使用不同的子网。 2. 在真机上调试——这并不比使用模拟器难多少,而且往往更好
    • 我不能。我们的网络设置为使用 10.115.23 范围,我目前没有可以测试的物理设备。我现在正在尝试通过套接字连接到 10.0.2.2 的本地计算机,但我不能!出了点问题..
    • 你得到什么错误?如果您打开 adb shell 并尝试 ping 已知主机,会发生什么?
    • 没有错误。只是什么都没有发生。挺烦人的。。而且我对adb shell一无所知,它是什么?
    猜你喜欢
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2015-08-12
    相关资源
    最近更新 更多