Страницы

Поиск по вопросам

суббота, 11 апреля 2020 г.

Как правильно проверить наличие подключения к интернету?

#java

                    
Сейчас использую метод

public Boolean getInternetStatus() {
    Boolean inetStatus;
    try {
        URL url = new URL(urlStr);
        URLConnection con = url.openConnection();
        con.setConnectTimeout(2000);
        con.setReadTimeout(2000);
        con.connect();
        inetStatus = true;
    } catch (Exception e) {
        inetStatus = false;
        log.error("getInternetStatus", e);
    }

    return inetStatus;
}


Вроде бы работает, но проблема в том что таймаут не срабатывает. Если сайт, к которому
идет обращение, висит, то коннект обрывается только через дефолтные 20 секунд. Получается
что приложение зависает на 20 сек. Подскажите, как правильно установить таймаут? Возможно
есть какой-то другой способ проверки подключения, чтобы обойти проблему таймаута?
    


Ответы

Ответ 1



Проверить наличие соединения с интернетом - просто протестировать загружается ли какой-либо сайт или нет (можно какой-нибудь сервис WhoIs или Google) В любом случае для проверки лучше всего использовать крупные сайты, например http://ru.stackoverflow.com или google.com. Либо проверять последовательно доступность нескольких сайтов - если хоть один из них доступен - значит соединение с интернетом присутствует. Способ 1: private static boolean checkInternetConnection() { Boolean result = false; HttpURLConnection con = null; try { con = (HttpURLConnection) new URL("http://ru.stackoverflow.com/").openConnection(); con.setRequestMethod("HEAD"); result = (con.getResponseCode() == HttpURLConnection.HTTP_OK); } catch (Exception e) { e.printStackTrace(); } finally { if (con != null) { try { con.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } return result; } Способ 2: (метод isReachable(), должен проверять хост в интернете на доступность) public class Inet2 { public static void main(String[] args) throws Exception { InetAddress in = InetAddress.getByName("http://ru.stackoverflow.com/"); System.out.println(in.isReachable(1000) ? "Host is reachable" : "Host is NOT reachable"); } } Способ 3: (способ заточенный под Windows. Основан на использовании ping) public class Inet3 { public static void main(String[] args) throws Exception { Process proc = Runtime.getRuntime().exec("ping -n 1 " + host); boolean reachable = (proc.waitFor()==0); System.out.println(reachable ? "Host is reachable" : "Host is NOT reachable"); } } а вообще... ЗАЧЕМ ТАКАЯ ПРОВЕРКА ВООБЩЕ НУЖНА? Вам нужен ответ от какого-то ресурса (ведь вы хотите куда-то обратиться) - попытайтесь обратиться сразу, без проверок доступности интернета. Если в ходе подключения появится ошибка - обработайте ее через try, выведите сообщение: "Пардон, пацаны, интернет не подключен!"

Комментариев нет:

Отправить комментарий