Как проверить доступность интернета на Java? - PullRequest
8 голосов
/ 14 марта 2009

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

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

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

Ответы [ 9 ]

10 голосов
/ 14 марта 2009

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

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

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

5 голосов
/ 13 ноября 2011

Использование

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
4 голосов
/ 14 марта 2009

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

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

2 голосов
/ 14 марта 2009

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

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

2 голосов
/ 14 марта 2009

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

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

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

1 голос
/ 14 марта 2009

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

1 голос
/ 14 марта 2009

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

0 голосов
/ 14 марта 2009

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

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

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

0 голосов
/ 14 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...