Ping vs HTTP HEAD

时间:2011-07-31 16:20:50

标签: java http ping head

我正在编写一个Java应用程序,它具有通过定期尝试访问服务器来检查它是否连接到Internet的功能。我的第一个想法是Ping服务器 - 但事实证明在Java中实现起来很复杂。所以我重新发送它以发送HTTP HEAD请求并检查HTTP响应代码。我有两个问题:

1)HTTP HEAD是否像ping一样“可靠”? Ping将是我检查某些东西是否可用的第一个自然选择。也许只是因为它在命令行上运行起来非常简单。

2)如果我向第三方网站发送HTTP HEAD请求以检查它是否可访问,是否应该发送这些请求的标准频率?例如,如果我每秒发送一次,那会不鼓励甚至阻止我阻止这些服务?

3 个答案:

答案 0 :(得分:5)

HTTP HEAD通常比ping更可靠,因为ICMP连接经常被阻止,而HTTP通常是打开的。每秒检查一次连接听起来相当多,但这实际上取决于你的用例你试图“ping”的第三方网站。

答案 1 :(得分:4)

我无法评论是否更有效地使用HEAD或尝试做一些事情,比如放入系统并执行ping操作;但我不认为他们中的任何一个都是你应该做的解决方案。恕我直言,没有必要轮询您的连接。在很多情况下可以删除连接,我认为轮询不会提供很多缓解问题的方法。此外,用户可能会生气。我知道,如果我正在使用一个应用程序,然后开始做其他事情,突然间我从应用程序中得到了“连接丢失到第三方错误”,我甚至没有注意到;我会非常生气。

如果您的应用程序依赖于存在的连接,那么我认为使用异常处理程序处理此问题是公平的。我愿意打赌,无论您使用什么API,只要您尝试网络操作并且无法建立连接,就会抛出某种异常。所以,我要做的是在你正在初始化网络行动的任何课程中,我都会遵循这个范例:

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

您的应用程序应该无法确定连接何时丢失,以及在尝试网络操作时如何做出反应并且未找到任何连接。

话虽如此 - 你仍然可能不同意我的意见。如果是这种情况,那么允许/推荐的轮询频率可能会记录在您正在使用的服务的API中。此外,如果来自第三方的资源是静态的,您应该缓存它而不是反复获取它。

答案 2 :(得分:3)

我想展开@Dave's answer,评论是不够的。

  1. 当您丢失互联网连接时,会抛出java.io.IOException。看看sub-classes of IOException - UnknownHostException,SocketException和ProtocolException通常都是“没有Internet连接”的味道
  2. 创建一个处理异常的中心位置(这本身就是一种很好的做法)。如果你得到我上面提到的任何IOException,请将isInternetAvailable设置为false。
  3. 不是轮询互联网连接,而是切换到重试要执行的操作。你实现了同样的目标
  4. 使用退避策略 - 指数退避很有效。例如,在第一次失败后,等待5秒。第二次失败后,等待25秒,依此类推。 Gmail网络应用使用此策略。 Twitter commons has utility classes for backoff