安卓扫描本地子网

4
我正在编写一款小型测试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;
}

}

1个回答

3
模拟器不在您的计算机所在的子网中。它位于自己的虚拟子网中,通过自己的NAT路由器连接到计算机。关于此有一个解释:http://developer.android.com/guide/developing/devices/emulator.html#emulatornetworking 然而,通过其路由器,模拟器应该能够连接到互联网上的任何套接字。您尝试连接的地址是什么?模拟器不会路由10.0.0.0私有地址,因为它们是用于自身的。不确定168.192.0.0。您能否发布出现错误的代码?

谢谢回复。我正在尝试连接到位于10.115.23.*范围内的机器。 - David
这就是为什么NAT后面的私有地址很糟糕,最好为每台机器使用公共地址。您拥有两个网络都使用相同的地址空间。建议:
  1. 重新编号您的网络以使用不同的子网。
  2. 在真实设备上进行调试-它并不比使用模拟器更困难,并且通常更好。
- Richard
我无法连接。我们的网络设置使用10.115.23范围,而我目前没有物理设备进行测试。我正在尝试通过socket连接到本地机器10.0.2.2,但是无法连接!有些东西出错了。。 - David
你遇到了什么错误?如果你打开adb shell并尝试ping已知的主机,会发生什么? - Chris Stratton
没有错误,但什么也没发生。这真的很烦人。而且我对adb shell一无所知,它是什么? - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接