У меня есть 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;
}
}
Это возвращает правильное значение в конце процесса, бит слишком медленный, если сервер недоступен.
ИЗМЕНИТЬ
Я понял, в чем причина медлительности
a) если сервер возвращает некоторые данные, но прерывает запрос до завершения запроса, тайм-аут игнорируется и застревает до тех пор, пока не будет возвращено Exception
, которое приведет к достижению блока catch, это причина медлительности этого метода, и все же я не знаю не нашел подходящего решения, чтобы избежать этого.
б) Если я запускаю устройство Android и открываю приложение без подключения, ложное значение возвращается правильно, если приложение открывается с активным подключением к Интернету и устройство потеряло подключение к Интернету, происходит то же самое, что и в случае A (также, если я попробуйте завершить и перезапустить приложение ... я не знаю почему, я полагаю, что что-то осталось в кеше)
Кажется, все это связано с тем, что Java URLConnection
не обеспечивает отказоустойчивого тайм-аута при чтении. Глядя на образец по этой ссылке, я заметил, что в нем используется поток чтобы каким-то образом прервать соединение, но если я просто добавлю строку new Thread(new InterruptThread(Thread.currentThread(), con)).start();
, как в примере, ничего не изменится.