Как проверить доступность Интернета на Java?

Я не хочу говорить, что интернет недоступен, когда я поймаю исключение из url.openStream().

Есть ли простой способ узнать, подключен ли компьютер к Интернету на Java? В этом случае "подключенный к Интернету" означает возможность загрузки данных с определенного URL-адреса.

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

Ответ 1

Проблема, которую вы пытаетесь избежать, ждет вашего HTTP-соединения, чтобы определить, что URL-адрес, который вы пытаетесь получить, действительно недоступен. Чтобы достичь этого, вам нужно прекратить использование url.openStream(), который является ярлыком для openConnection(). GetInputStream() и получить более тонкий контроль над вашим соединением.

URLConnection conn = url.openConnection();  
conn.setConnectTimeout(timeoutMs);  
conn.setReadTimeout(timeoutMs);  
in = conn.getInputStream();  

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

Ответ 2

Используйте

Process p1 = java.lang.Runtime.getRuntime().exec("ping www.google.com");
System.out.println(p1.waitFor());
// return code for p1 will be 0 if internet is connected, else it will be 1

Ответ 3

Нет такой вещи, как "Доступность Интернета". Представьте, что ваш HTTP-запрос проходит через прозрачный HTTP-прокси, вы пытаетесь получить доступ к узлу с черным списком и получаете HTTP-ответ от прокси-сервера, сообщающий вам об отказе в доступе. Доступен ли Интернет в этом сценарии или нет?

Я думаю, вы будете более конкретны в своей проблеме.

Ответ 4

Возможно, вы узнаете, подключен ли к сети сетевой адаптер, но даже если он не гарантирует работу сети или что он подключен к Интернету.

Это одна из проблем "сосать и видеть".

Что случилось с попыткой подключения? И почему вас беспокоит, подключены ли они к Интернету?

Ответ 5

Если критерием является доступ к данному веб-серверу, единственный способ узнать, - это доступ к этому веб-серверу.

Вы можете, однако, сделать это в фоновом потоке при запуске, чтобы приложение не задерживалось им. Затем ответ "да/нет" доступен, когда требуется фактическая загрузка. Поместите сообщение в строку состояния, чтобы пользователь знал, что происходит, и не удивляется о непосвященном "подключении к сети", если он/она не подключен при запуске вашей программы.

Ответ 6

Я мало знаю о низкоуровневой HTTP-сантехнике, доступной на Java, но вы всегда можете запросить URL-адрес HTTP HEAD для URL-адреса заранее. Это заставляет сервер отправлять обратно только заголовки, а не данные. При тайм-ауте 1-3 секунды вы сможете избежать любых длительных задержек.

Ответ 7

Если вы программируете подвешивание, ожидая загрузки, вы, вероятно, используете поток GUI для загрузки. Если вы используете фоновый поток, ваша программа не будет висеть, даже если потребуется много времени для тайм-аута/загрузки.

Ответ 8

Вы можете отправить сообщение ICMP на очень известный хост...

Ответ 9

Вы можете проверить NTP-сервер, если ваш брандмауэр не запрещает.

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

Вы можете проверить один или два динамических URL, которые постоянно меняются. Для instace, веб-сайт, показывающий время. Например этот, я нашел googleing. Более одного, поскольку сайты могут быть недоступны; -)

Ответ 10

Я всегда пинг www.yahoo.com.