Отладка 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
}