Android扫描本地子网

时间:2011-02-24 14:57:34

标签: java android sockets networking emulation

我目前正在编写一个小型测试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 个答案:

答案 0 :(得分:3)

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

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