4

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

1) HTTP HEAD 请求是否与 ping 一样“可靠”?Ping 将是我检查是否可用的第一个自然选择。也许只是因为它很容易在命令行上运行。

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

4

3 回答 3

5

HTTP HEAD 通常比 ping 更可靠,因为 ICMP 连接通常被阻止而 HTTP 通常是打开的。每秒检查一次连接听起来很过分,但这实际上取决于您的用例,您尝试“ping”哪个第三方站点。

于 2011-07-31T16:24:37.640 回答
4

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

如果您的应用程序依赖于存在的连接,那么我认为使用异常处理程序来处理它是公平的。我敢打赌,无论何时尝试网络操作并且无法建立连接,您使用的任何 API 都会引发某种异常。所以,我要做的是在你初始化网络动作的任何类中,我都会遵循这个范例:

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

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

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

于 2011-07-31T16:32:54.430 回答
3

我想扩展@Dave 的答案,但评论是不够的。

  1. 当您失去互联网连接时,java.io.IOException会抛出 a。查看IOException 的子类- UnknownHostException、SocketException 和 ProtocolException 是通常闻起来“没有 Internet 连接”的那些
  2. 创建一个处理异常的中心位置(这本身就是一个好习惯)。如果您遇到我上面提到的任何 IOException,请将 isInternetAvailable 设置为 false。
  3. 不要轮询互联网连接,而是切换到重试您要执行的操作。你实现了同样的目标
  4. 使用退避策略 - 指数退避效果很好。例如,第一次失败后,等待 5s。第二次失败后,您等待 25 秒,以此类推。Gmail webapp 使用这种策略。Twitter commons 有用于 backoff 的实用程序类
于 2011-08-01T02:10:46.077 回答