Отладка Android InetAddress.isReachable

Я пытаюсь выяснить, как определить, доступен ли конкретный ipaddress в приложении для Android в процессе отладки (я не пробовал это на реальном устройстве).

Из чтения видно, что InetAddress.isReachable должен сделать это для меня.

Изначально я думал, что могу написать что-то вроде:

InetAddress address = InetAddress.getByAddress(новый байт [] {(байт) 192, (байт) 168, (байт) 254, (байт) 10); success = address.isReachable(3000);

Это возвращает false, хотя я уверен, что это доступный адрес.

Я обнаружил, что если я изменил это на 127, 0, 0, 1, он вернул успех.

Моя следующая попытка была в том же коде, но я использовал адрес, который я получил от ping www.google.com(72.167.164.64 на момент написания этой статьи). Нет успеха.

Итак, я попробовал еще один пример:

int timeout = 2000;
InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
for (InetAddress address : addresses)
{
    if ( address.isReachable(timeout))
    {
       success = true; // just set a break point here
    }
}

Я относительно новичок в Java и Android, поэтому я подозреваю, что у меня что-то не хватает, но я не могу найти ничего, что могло бы указать на то, что это такое.

Ответ 1

кажется, что isReachable() никогда не работал хорошо на Android b/c, он пытается использовать ICMP, который обычно требует привилегий root, а затем пытается установить соединение с портом 7, который обычно не имеет запущенных сервисов в современных системах.

лучше проверить соединение с установлением соединения TCP с портами, которые, как вы знаете, должны быть открыты.

Ответ 2

Спасибо Zed, я также знаю, что адрес, который я пытаюсь получить, вернет html, поэтому я могу сделать больше, чем посмотреть на сокет. Вот что я в итоге сделал, что работает разумно для моей проблемы. Параметр pUrl имеет адрес веб-сайта в нем. Я выбрал 3 секунды для таймаута.

boolean result = false;
try
{
    HttpGet request = new HttpGet(pUrl.toString());

    HttpParams httpParameters = new BasicHttpParams();  

    HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);
    HttpClient httpClient = new DefaultHttpClient(httpParameters);
    HttpResponse response = httpClient.execute(request);

    int status = response.getStatusLine().getStatusCode();

    if (status == HttpStatus.SC_OK) 
    {
        result = true;
    }

}
catch (SocketTimeoutException e)
{
    result = false; // this is somewhat expected
}