Отладка Android InetAddress.isReachable - PullRequest
7 голосов
/ 29 мая 2010

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

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

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

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

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

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

Моей следующей попыткой был тот же код, но я использовал адрес, полученный с пинга 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, поэтому подозреваю, что что-то упустил, но не могу найти ничего, что указывало бы, что это такое.

Ответы [ 2 ]

13 голосов
/ 29 мая 2010

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

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

5 голосов
/ 30 мая 2010

Спасибо, Зед, я также знаю, что адрес, который я пытаюсь получить, вернет 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...