Android Scan Локальная подсеть - PullRequest
       9

Android Scan Локальная подсеть

3 голосов
/ 24 февраля 2011

Я сейчас пишу небольшое тестовое приложение для 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 голосов
/ 24 февраля 2011

Эмулятор не находится в той же подсети, что и ваш компьютер. Он находится в собственной виртуальной подсети, подключенной к компьютеру через собственный маршрутизатор NAT. Здесь есть объяснение: http://developer.android.com/guide/developing/devices/emulator.html#emulatornetworking

Однако эмулятор через маршрутизатор должен иметь возможность подключения к любому сокету в любом месте Интернета. По какому адресу вы пытаетесь подключиться? Эмулятор не будет маршрутизировать частные адреса 10.0.0.0, потому что он использует их для себя. Не уверен насчет 168.192.0.0. Можете ли вы опубликовать код, который не работает?

...