Как проверить доступность Интернета на 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.