Пинг против HTTP HEAD - PullRequest
       17

Пинг против HTTP HEAD

4 голосов
/ 31 июля 2011

Я пишу Java-приложение, в котором есть функция проверки подключения к Интернету путем периодической попытки доступа к серверу.Моя первая идея состояла в том, чтобы проверить связь с сервером, но в Java это оказалось сложно реализовать.Поэтому я переделал его, чтобы отправлять запросы HTTP HEAD и вместо этого проверять код ответа HTTP.У меня есть два вопроса:

1) Являются ли запросы HTTP HEAD "такими же надежными", как пинг?Пинг был бы моим первым естественным выбором, чтобы проверить, доступно ли что-нибудь.Может быть, просто потому, что его так легко запустить из командной строки.

2) Если я отправляю запросы HTTP HEAD на сторонний веб-сайт, чтобы проверить, доступен ли он, есть ли какая-то стандартная частота, с которой они должны бытьпослал?Например, если я отправлю их каждую секунду, это будет обескуражено или даже заблокирует меня от этих услуг?

Ответы [ 3 ]

5 голосов
/ 31 июля 2011

HTTP HEAD, как правило, более надежен, чем пинг, так как соединения ICMP часто блокируются, а HTTP обычно открыт.Проверка подключения каждую секунду звучит довольно излишне, но это действительно зависит от вашего варианта использования, какой сторонний сайт вы пытаетесь «пинговать».

4 голосов
/ 31 июля 2011

Я не могу комментировать, более эффективно ли использовать HEAD или пытаться сделать что-то вроде сброса в систему и выполнить пинг;но я не думаю, что любое из них - это решение, которое вы должны делать.ИМХО, не нужно опрашивать ваше соединение.Есть много ситуаций, когда соединение может быть разорвано, и я не думаю, что опрос предоставит многое для смягчения проблемы.Кроме того, пользователь может быть раздражен.Я знаю, что если бы я использовал приложение, а затем начал делать что-то еще, и внезапно я получил «потерянное соединение с ошибкой третьей стороны» из приложения, на которое я даже не обратил внимания;Я был бы очень раздражен.

Если ваше приложение зависит от наличия соединения, то я думаю, будет справедливо обработать это с помощью обработчиков исключений.Я готов поспорить, что любой используемый вами API выдает какое-то исключение, когда вы пытаетесь выполнить сетевое действие, и вы не можете установить соединение.Итак, что бы я сделал в любом классе, который вы инициализируете действие сети, я бы следовал этой парадигме:

try {
  performNetworkAction();
} catch (NoConnectionFoundException e) {
  // handle the situation here
}

Ваше приложение не должно быть в состоянии определить, когда соединение было потеряно, просто какреагировать, когда вы пытаетесь выполнить сетевое действие, и соединение не найдено.

При этом вы все равно можете не согласиться со мной.В этом случае допустимая / рекомендуемая частота опроса может быть задокументирована в API для используемой вами службы.Кроме того, если ресурс стороннего производителя является статическим, вы должны кэшировать его, а не получать его снова и снова.

3 голосов
/ 01 августа 2011

Я хотел бы расширить @ ответ Дейва , и комментария было бы недостаточно.

  1. При потере подключения к Интернету выдается java.io.IOException.Посмотрите на подклассы IOException - UnknownHostException, SocketException и ProtocolException - это те, которые обычно пахнут "Нет подключения к Интернету"
  2. Создайте центральное место для обработки исключений (это хорошая практикасамо по себе).Если вы получаете какое-либо из перечисленных выше исключений IOException, установите для isInternetAvailable значение false.
  3. Вместо того, чтобы опрашивать интернет-соединение, переключитесь на попытку повторить операцию, которую вы хотите выполнить.Вы достигаете того же самого
  4. Используйте стратегию отсрочки - экспоненциальная отсрочка прекрасно работает.Например, после первого сбоя вы ждете 5 секунд.После второго сбоя вы ждете 25 секунд и так далее.Веб-приложение Gmail использует эту стратегию. В общих ресурсах Twitter есть служебные классы для отката .
...