我正在编写一个Java应用程序,它具有通过定期尝试访问服务器来检查它是否连接到Internet的功能。我的第一个想法是Ping服务器 - 但事实证明在Java中实现起来很复杂。所以我重新发送它以发送HTTP HEAD请求并检查HTTP响应代码。我有两个问题:
1)HTTP HEAD是否像ping一样“可靠”? Ping将是我检查某些东西是否可用的第一个自然选择。也许只是因为它在命令行上运行起来非常简单。
2)如果我向第三方网站发送HTTP HEAD请求以检查它是否可访问,是否应该发送这些请求的标准频率?例如,如果我每秒发送一次,那会不鼓励甚至阻止我阻止这些服务?
答案 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,评论是不够的。
java.io.IOException
。看看sub-classes of IOException - UnknownHostException,SocketException和ProtocolException通常都是“没有Internet连接”的味道