Android Scan Local Subnet

房东的猫 提交于 2019-12-06 07:34:02

问题


I'm currently writing a small test Android app, and have run across a small (large) problem with the emulator.

The code that goes out and scans the local subnet for computers running my server piece of the software does not return anything! This code functions perfectly on the desktop portion, so I know something is wrong inside of my emulator.

I had to hardcode the IP scan first because I cannot determine the IP address within the emulator, so I know I'm at least scanning the right range.

Summary: How can I connect to servers via sockets from inside my emulator on the local subnet?

Thanks all!

Here's the requested code:

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:


The emulator is not on the same subnet as your computer. It's on it's own virtual subnet connected to the computer via its own NAT router. There is an explanation here: http://developer.android.com/guide/developing/devices/emulator.html#emulatornetworking

However, the emulator, via its router, should be able to connect to any socket anywhere on the Internet. What is the address you are trying to connect to? The emulator won't route 10.0.0.0 private addresses because it uses them for itself. Not sure about 168.192.0.0. Can you post the code that is failing?



来源:https://stackoverflow.com/questions/5106315/android-scan-local-subnet

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!