==
определяет, равны ли значения, в то время как is
определяет, являются ли они тем же самым объектом и равный.
Это вполне разумный подход к решению проблемы. Плохо то, что вы на самом деле тестируете DNS, а не всю сеть, но на практике вы часто можете обойтись, рассматривая их как эквивалентные.
Еще нужно помнить, что вам нужно установить системное свойство чтобы отключить кеширование DNS во время выполнения java. В противном случае он может продолжать сообщать, что сеть работает на основе кэшированных данных (даже если она не работает).
Другой подход состоит в том, чтобы на самом деле часто открывать HTTP-запрос на некоторый сетевой адрес, такой как этот.
Обратите внимание, что он может вернуть false, если java.sun.com не отвечает! В этом случае вам следует проверить другой сайт, чтобы быть уверенным.
Единственный способ быть НАДЕЖНЫМ в том, что вы можете связаться с данной службой, - это выполнить фиктивный запрос к этой службе. Пинги могут быть заблокированы брандмауэрами. Некоторые серверы могут быть доступны, другие - нет. Если вам нужно поговорить с веб-сервисом, создайте статическую страницу, которая будет возвращаться для этих запросов.
Также не забудьте спросить пользователя, прежде чем пытаться связаться.
Не тестировал, но предлагаю посмотреть java.net.NetworkInterface.getNetworkInterfaces (). Это возвращает перечисление всех сетевых интерфейсов на машине или null, если их нет.
Я не уверен, можно ли предположить, что ненулевой ответ гарантирует действительное сетевое соединение - в зависимости от ваших потребностей вам может потребоваться или не потребоваться отфильтровать адреса обратной связи (что, я думаю, вы могли бы сделать с java.net.NetworkInterface.getInetAddresses () для каждого возвращенного NetworkInterface, а затем вызывает InetAddress.isLoopbackAddress () для каждого из них.)
Вопрос действительно не имеет смысла. Не существует такого понятия, как «подключение к Интернету». Вы должны попытаться создать один. Упомянутый Windows API только сообщает вам, набран ваш модем или нет, и я видел, что на самом деле вызывает дозвон, что не совсем идея. Не то, чтобы мне звонили последние 8 лет или около того.
Проблема с первым решением заключается в том, что InetAddress имеет кеш, поэтому, когда вы теряете соединение для следующих нескольких вызовов, имя разрешается через кеш java. С подключением URL-адреса у вас есть Проблема в том, что вы используете getContent, который должен получать html, чтобы у вас было потребление данных. Если вызовы выполняются очень часто, это может быть проблемой (тем более, если у вас нет безлимитного тарифного плана на устройстве, на котором запущено программное обеспечение).
Я думаю, что лучшим решением было бы установить TCP-соединение с портом 80 и закрыть его сразу после успешного соединения. Это будет вести себя как окончательный код, но будет иметь гораздо меньше трафика.
Я должен добавить, что, хотя последний блок кода, приведенный выше, хорош, у него есть один недостаток - это может занять очень много времени. время связаться с указанным адресом, но адрес все еще доступен.
В моем случае при тестировании с одним адресом метод возвращал истину, но получение ответа занимало 10 секунд или больше. В этом случае сервер был доступен, но не для каких-либо полезных целей, поскольку соединение было очень медленным. Это происходит из-за того, что тайм-аут по умолчанию для HttpURLConnection
равен 0 или бесконечен.
По этой причине я бы рекомендовал вам выполнить проверку потока пользовательского интерфейса и добавить urlConnect.setConnectTimeout (1000);
перед вызовом urlConnect.getContent ();
Таким образом вы узнаете, что адрес доступен и что загрузка файла размером 10 КБ не займет 5 лет.
(Вы, конечно, можете изменить время ожидания в соответствии с вашими потребностями)
Также я бы рекомендовал не проверять общий адрес (google.com и т. Д.), Если ваша программа обычно не обращается к более чем нескольким доменам.Если вы получаете доступ только к одному или двум, проверьте этот домен.