Как быстро проверить, доступен ли URL-сервер

У меня есть URL в форме

http://www.mywebsite.com/util/conv?a=1&from=%s&to=%s

И хочу проверить, если это доступно.

Ссылки перенаправляют меня на страницу с ошибочными запросами, если я пытаюсь открыть их с помощью браузера, однако с помощью кода я могу получить нужные мне данные.

Использование блока try-catch в процедуре HTTP-запроса довольно медленное, поэтому мне интересно, как я могу пропинговать аналогичный адрес, чтобы проверить, активен ли его сервер.

я пытался

boolean reachable = InetAddress.getByName(myLink).isReachable(6000);

Но возвращается всегдаfalse.

Я также пытался

public static boolean exists(String URLName) {

    try {
        HttpURLConnection.setFollowRedirects(false);
        HttpURLConnection con = (HttpURLConnection) new URL(URLName).openConnection();
        con.setConnectTimeout(1000);
        con.setReadTimeout(1000);
        con.setRequestMethod("HEAD");
        return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

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

РЕДАКТИРОВАТЬ

Я понял, в чем причина медлительности

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

б) Если я запускаю устройство Android и открываю приложение без подключения, ложное значение возвращается правильно, если приложение открыто с активным подключением к Интернету, и устройство потеряло подключение к Интернету, происходит то же самое, что и в случае А (также, если я попытаться завершить и перезапустить приложение ... я не знаю почему, я полагаю, что что-то остается в кэше)

Все это, похоже, связано с тем,Java URLConnection не обеспечивает безотказного тайм-аута при чтении. Глядя на образец вэта ссылка Я видел, что использует поток, чтобы каким-то образом прервать соединение, но если я просто добавлю строкуnew Thread(new InterruptThread(Thread.currentThread(), con)).start(); как в образце ничего не меняется.

Ответы на вопрос(8)

Ваш ответ на вопрос