有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javaping与HTTP头

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

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

2)如果我向第三方网站发送HTTP HEAD请求以检查其是否可访问,是否存在发送这些请求的标准频率?如果我每秒钟发送一次,这会让我泄气,甚至让我无法使用这些服务吗


共 (3) 个答案

  1. # 1 楼答案

    我不能评论使用HEAD是否更有效,或者尝试做一些事情,比如进入系统并进行ping;但我认为这两种方法都不是你应该做的解决方案。我知道,没有必要轮询你的连接。在很多情况下,连接可能会被断开,我不认为轮询能够提供很多缓解问题的方法。此外,用户可能会感到恼火。我知道,如果我在使用一个应用程序,然后开始做其他事情,突然,我从一个我根本没有注意的应用程序中得到了一个“连接丢失到第三方错误”;我会很生气的

    如果您的应用程序依赖于存在的连接,那么我认为使用异常处理程序处理这个问题是公平的。我敢打赌,无论您使用什么API,只要您尝试网络操作而无法建立连接,就会抛出某种异常。所以,我要做的是,在初始化网络操作的任何类中,我都会遵循以下范例:

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

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

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

  2. # 2 楼答案

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

  3. # 3 楼答案

    我想扩展@Dave's answer,但仅发表评论是不够的

    1. 当您失去internet连接时,将抛出java.io.IOException。看看sub-classes of IOException未知的hostexception、socketxception和ProtocolException,它们通常都有“没有互联网连接”的味道
    2. 为处理异常创建一个中心位置(这本身就是一个很好的实践)。如果您得到我上面提到的任何IOException,请将isInternetAvailable设置为false
    3. 切换到重试要执行的操作,而不是轮询internet连接。你实现了同样的目标
    4. 使用退避策略-指数退避效果很好。例如,第一次失败后,您等待5s。第二次失败后,等待25秒,以此类推。Gmail webapp使用这种策略Twitter commons has utility classes for backoff