javaping与HTTP头
我正在编写一个Java应用程序,它有一个功能,可以通过定期尝试访问服务器来检查它是否连接到internet。我的第一个想法是Ping服务器,但用Java实现起来很复杂。所以我重新制作了它来发送HTTP HEAD请求,并检查HTTP响应代码。我有两个问题:
1)HTTP头请求是否与ping一样“可靠”?Ping将是我检查是否有可用内容的第一个自然选择。也许只是因为它很容易在命令行上运行
2)如果我向第三方网站发送HTTP HEAD请求以检查其是否可访问,是否存在发送这些请求的标准频率?如果我每秒钟发送一次,这会让我泄气,甚至让我无法使用这些服务吗
# 1 楼答案
我不能评论使用HEAD是否更有效,或者尝试做一些事情,比如进入系统并进行ping;但我认为这两种方法都不是你应该做的解决方案。我知道,没有必要轮询你的连接。在很多情况下,连接可能会被断开,我不认为轮询能够提供很多缓解问题的方法。此外,用户可能会感到恼火。我知道,如果我在使用一个应用程序,然后开始做其他事情,突然,我从一个我根本没有注意的应用程序中得到了一个“连接丢失到第三方错误”;我会很生气的
如果您的应用程序依赖于存在的连接,那么我认为使用异常处理程序处理这个问题是公平的。我敢打赌,无论您使用什么API,只要您尝试网络操作而无法建立连接,就会抛出某种异常。所以,我要做的是,在初始化网络操作的任何类中,我都会遵循以下范例:
您的应用程序不应该能够确定连接何时丢失,只知道在尝试网络操作但未找到连接时如何反应
尽管如此,你仍然可能不同意我的观点。如果是这种情况,那么允许/建议的轮询频率可能会记录在您正在使用的服务的API中。此外,如果来自第三方的资源是静态的,您应该缓存它,而不是一次又一次地获取它
# 2 楼答案
HTTP头通常比ping更可靠,因为ICMP连接经常被阻塞,HTTP通常是开放的。每秒检查一次连通性听起来太过分了,但这实际上取决于您的用例,即您试图“ping”的第三方站点
# 3 楼答案
我想扩展@Dave's answer,但仅发表评论是不够的
java.io.IOException
。看看sub-classes of IOException未知的hostexception、socketxception和ProtocolException,它们通常都有“没有互联网连接”的味道