У меня есть URL-адрес в форме
http://www.mywebsite.com/util/conv?a=1&from=%s&to=%s
И хочу проверить, доступно ли это.
Ссылки перенаправляют меня на страницу с плохим запросом, если я пытаюсь открыть их с помощью браузера, однако через код я могу получить нужные мне данные.
Использование блока try-catch в процедуре HTTP-запроса выполняется довольно медленно, поэтому мне интересно, как я могу выполнить ping-адрес, чтобы проверить, активен ли его сервер.
Я пробовал
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, это является причиной медленности этого метода, и все же я не нашел правильного решения, чтобы избежать этого.
b) Если я запустил устройство Android и откройте приложение без подключения, ложное значение вернется правильно, если приложение открыто с подключением к Интернету активно, а устройство потеряло интернет-соединение, происходит то же самое в случае A ( также, если я пытаюсь закончить и перезапустить приложение... Я не знаю, почему, я полагаю, что что-то остается в кеше)
Все это, по-видимому, связано с тем, что Java URLConnection
не обеспечивает отказоустойчивого таймаута при чтении. Глядя на образец на эту ссылку, я видел, что использует поток, чтобы каким-то образом прервать соединение, но если я просто добавлю строку new Thread(new InterruptThread(Thread.currentThread(), con)).start();
, как в примере, ничего изменения.