4

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;
}

}

David
  • 1,296
  • 1
  • 15
  • 25

1 Answers1

3

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?

Richard
  • 899
  • 1
  • 8
  • 12
  • Thanks for the reply. I'm attempting to connect to machines that are on the 10.115.23.* range. – David Feb 24 '11 at 16:20
  • Well that's why private addresses behind NAT suck and it would be better to use public addresses for every machine. You've got two networks both using the same address space. Suggestions: 1. renumber your network to use a different subnet. 2. debug on a real device - it's not much more difficult than using the emulator, and often better – Richard Feb 24 '11 at 16:32
  • I can't. Our network is set up to use the 10.115.23 range, and I have no physical device to test on at the moment. I am attempting to connect via socket to the local machine of 10.0.2.2 now and I can't! Something is wrong.. – David Feb 24 '11 at 16:40
  • What error do you get? If you open up the adb shell and try to ping the known host, what happens? – Chris Stratton Feb 24 '11 at 18:25
  • No errors. Just nothing happens. It's quite annoying.. And I don't know anything about the adb shell, what is it? – David Feb 24 '11 at 20:55