Как быстро проверить, доступен ли 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();
как в образце ничего не меняется.