java Ping与HTTP报头

mf98qq94  于 2023-01-24  发布在  Java
关注(0)|答案(3)|浏览(114)

我正在写一个Java应用程序,它有一个功能,可以通过定期尝试访问服务器来检查它是否连接到互联网。我的第一个想法是Ping服务器--但在Java中实现起来很复杂。所以我重新设计了它,改为发送HTTP HEAD请求并检查HTTP响应代码。我有两个问题:
1)HTTP HEAD请求和ping一样可靠吗?Ping将是我检查是否有可用内容的第一个自然选择。也许只是因为它很容易在命令行上运行。
2)如果我向第三方网站发送HTTP HEAD请求以检查其是否可访问,是否存在发送这些请求的标准频率?例如,如果我每秒发送一次,是否会受到阻碍或甚至阻止我使用这些服务?

toe95027

toe950271#

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

du7egjpx

du7egjpx2#

我无法评论使用HEAD还是尝试做一些像进入系统并执行ping这样的操作是否更有效;但我不认为这两个都是你应该做的解决方案。恕我直言,没有必要轮询你的连接。有很多情况下,一个连接可能会被删除,我不认为轮询将提供很多的方式来减轻问题。此外,用户可能会恼火。我知道,如果我正在使用一个应用程序,然后开始做别的事情,突然间,我从一个我根本没有注意的应用程序中得到了一个“连接丢失到第三方错误”;我会很生气的。
如果你的应用程序依赖于一个连接的存在,那么我认为用异常处理程序来处理这个问题是公平的。我敢打赌,无论你使用什么样的API,只要你尝试一个网络操作,你就不能建立一个连接,就会抛出某种异常。所以,我会做的是,无论你在什么样的类中初始化网络操作,我会遵循这个范例:

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

您的应用程序不应该能够确定连接何时丢失,而应该能够确定当您尝试执行网络操作但找不到连接时如何做出React。
话虽如此,你可能还是不同意我的观点。如果是这样的话,那么允许/推荐的轮询频率可能会记录在你正在使用的服务的API中。另外,如果来自第三方的资源是静态的,你应该缓存它,而不是一遍又一遍地获取它。

ftf50wuq

ftf50wuq3#

我想扩大“戴夫”的回答,一个评论是不够的。
1.当您失去互联网连接时,会抛出java.io.IOException。请查看sub-classes of IOException- UnknownHostException、SocketException和ProtocolException是通常感觉“没有互联网连接”的异常。
1.创建一个处理异常的中心位置(这本身就是一个很好的实践),如果你得到了我上面提到的任何一个IOException,设置isInternetAvailable为false。
1.不是轮询Internet连接,而是切换到重试要执行的操作。
1.使用回退策略-指数回退效果很好。例如,在第一次失败后,等待5秒。第二次失败后,等待25秒,以此类推。Gmail webapp使用此策略。Twitter commons has utility classes for backoff

相关问题