2011-07-31 64 views
3

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

1)HTTP HEAD请求是否与ping一样“可靠”?平是我的第一个自然选择,以检查是否有可用的东西。也许只是因为在命令行上运行起来非常简单。

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

+1

当你说“一个第三方网站”,你是一个拥有的网站还是一些随机网站?请不要通过ping其他人的网站。这可能会导致[麻烦](http://en.wikipedia.org/wiki/NTP_server_misuse_and_abuse)。 –

回答

5

HTTP HEAD通常比ping更可靠,因为ICMP连接经常被阻塞,并且HTTP通常是打开的。每秒检查一次连接情况听起来相当过分,但这取决于你的用例是什么第三方网站,你试图“ping”。

+1

OPTIONS请求更好,因为它没有关联到需要首先查找的资源(以获取其长度等)。 – pyroscope

4

我无法评论它是否更有效地使用HEAD或尝试执行诸如放入系统并执行ping操作等操作;但我不认为他们中的任何一个都是你应该做的解决方案。恕我直言,这是没有必要轮询你的连接。有很多情况下连接可能会被丢弃,我不认为投票会为减轻问题提供很多帮助。另外,用户可能会感到烦恼。我知道,如果我正在使用应用程序,然后开始做其他事情,突然之间我从一个我甚至没有注意到的应用程序中发现“连接失去了第三方错误”;我会非常恼火。

如果你的应用程序依赖于一个正在存在的连接,那么我认为它适用于使用异常处理程序处理这个问题。我敢打赌,无论您尝试网络操作而无法建立连接,您使用的任何API都会抛出某种异常。所以,我会做的是在任何类,你要初始化网络行动,我会按照这种模式:

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

您的应用程序不应该能够确定何时连接丢失,只是如何应对当您尝试网络操作并且找不到连接时。

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

3

我想扩大@Dave's answer,并且评论是不够的。

  1. 当您失去互联网连接时,会引发java.io.IOException。看看sub-classes of IOException - UnknownHostException,SocketException和ProtocolException是通常闻到“没有互联网连接”的那个
  2. 创建一个处理异常的中心位置(这本身就是一个很好的实践)。如果你得到了上面提到的任何IOException,请将isInternetAvailable设置为false。
  3. 而不是轮询互联网连接,切换到重试您想要执行的操作。你达到同样的效果
  4. 使用退避策略 - 指数退避效果很好。例如,第一次失败后,您等待5秒钟。第二次失败后,你等待25秒等等。 Gmail webapp使用此策略。Twitter commons has utility classes for backoff