Обнаружьте интернет-соединение с помощью Java [дубликат]

== определяет, равны ли значения, в то время как is определяет, являются ли они тем же самым объектом и равный.

35
задан Community 23 May 2017 в 12:02
поделиться

7 ответов

Это вполне разумный подход к решению проблемы. Плохо то, что вы на самом деле тестируете DNS, а не всю сеть, но на практике вы часто можете обойтись, рассматривая их как эквивалентные.

Еще нужно помнить, что вам нужно установить системное свойство чтобы отключить кеширование DNS во время выполнения java. В противном случае он может продолжать сообщать, что сеть работает на основе кэшированных данных (даже если она не работает).

Другой подход состоит в том, чтобы на самом деле часто открывать HTTP-запрос на некоторый сетевой адрес, такой как этот.

17
ответ дан 27 November 2019 в 15:41
поделиться

Обратите внимание, что он может вернуть false, если java.sun.com не отвечает! В этом случае вам следует проверить другой сайт, чтобы быть уверенным.

3
ответ дан 27 November 2019 в 15:41
поделиться

Единственный способ быть НАДЕЖНЫМ в том, что вы можете связаться с данной службой, - это выполнить фиктивный запрос к этой службе. Пинги могут быть заблокированы брандмауэрами. Некоторые серверы могут быть доступны, другие - нет. Если вам нужно поговорить с веб-сервисом, создайте статическую страницу, которая будет возвращаться для этих запросов.

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

2
ответ дан 27 November 2019 в 15:41
поделиться

Не тестировал, но предлагаю посмотреть java.net.NetworkInterface.getNetworkInterfaces (). Это возвращает перечисление всех сетевых интерфейсов на машине или null, если их нет.

Я не уверен, можно ли предположить, что ненулевой ответ гарантирует действительное сетевое соединение - в зависимости от ваших потребностей вам может потребоваться или не потребоваться отфильтровать адреса обратной связи (что, я думаю, вы могли бы сделать с java.net.NetworkInterface.getInetAddresses () для каждого возвращенного NetworkInterface, а затем вызывает InetAddress.isLoopbackAddress () для каждого из них.)

2
ответ дан 27 November 2019 в 15:41
поделиться

Вопрос действительно не имеет смысла. Не существует такого понятия, как «подключение к Интернету». Вы должны попытаться создать один. Упомянутый Windows API только сообщает вам, набран ваш модем или нет, и я видел, что на самом деле вызывает дозвон, что не совсем идея. Не то, чтобы мне звонили последние 8 лет или около того.

1
ответ дан 27 November 2019 в 15:41
поделиться

Проблема с первым решением заключается в том, что InetAddress имеет кеш, поэтому, когда вы теряете соединение для следующих нескольких вызовов, имя разрешается через кеш java. С подключением URL-адреса у вас есть Проблема в том, что вы используете getContent, который должен получать html, чтобы у вас было потребление данных. Если вызовы выполняются очень часто, это может быть проблемой (тем более, если у вас нет безлимитного тарифного плана на устройстве, на котором запущено программное обеспечение).

Я думаю, что лучшим решением было бы установить TCP-соединение с портом 80 и закрыть его сразу после успешного соединения. Это будет вести себя как окончательный код, но будет иметь гораздо меньше трафика.

2
ответ дан 27 November 2019 в 15:41
поделиться

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

В моем случае при тестировании с одним адресом метод возвращал истину, но получение ответа занимало 10 секунд или больше. В этом случае сервер был доступен, но не для каких-либо полезных целей, поскольку соединение было очень медленным. Это происходит из-за того, что тайм-аут по умолчанию для HttpURLConnection равен 0 или бесконечен.

По этой причине я бы рекомендовал вам выполнить проверку потока пользовательского интерфейса и добавить urlConnect.setConnectTimeout (1000); перед вызовом urlConnect.getContent ();

Таким образом вы узнаете, что адрес доступен и что загрузка файла размером 10 КБ не займет 5 лет.

(Вы, конечно, можете изменить время ожидания в соответствии с вашими потребностями)

Также я бы рекомендовал не проверять общий адрес (google.com и т. Д.), Если ваша программа обычно не обращается к более чем нескольким доменам.Если вы получаете доступ только к одному или двум, проверьте этот домен.

11
ответ дан 27 November 2019 в 15:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: