使用 OkHttp java 进行远程服务器可用性检查

Posted

技术标签:

【中文标题】使用 OkHttp java 进行远程服务器可用性检查【英文标题】:Remote server availability check using OkHttp java 【发布时间】:2022-01-04 18:29:11 【问题描述】:

我正在寻找一些关于如何使用 OkHttp3 在 Java 中通过 Http/2 检查服务器可用性的示例。找不到任何示例。

我正在寻找提供以下信息的来源

证书 凭据的必要性 示例代码(如果有)。

OkHttp3 有更好的替代品吗?

我们非常感谢您提供这方面的任何意见。

【问题讨论】:

你可以使用JDK中的HttpClient,它支持HTTP 2.0。 “ping”是什么意思? Ping 是 ICMP 协议的一部分,与 HTTP 无关。 我正在尝试检查服务器的可用性。有什么建议吗? 喜欢这个? square.github.io/okhttp/4.x/okhttp/okhttp3/-ok-http-client/… github 链接只提供了如何为连接设置 pinginterval。但没有提供有关如何发出请求以及需要哪些所有参数以及如何进行的任何信息。 只需向服务器发送请求(任意),甚至向路径根目录(/)发送简单的 GET 请求。如果服务器启动,它总是会响应一些东西,否则你会得到连接错误。 【参考方案1】:

一种典型的方法是对https://host.com/robots.txt 执行请求,甚至可能是头部请求。

fun main() 
  val client = OkHttpClient.Builder()
    .eventListener(object : EventListener() 
      override fun connectStart(call: Call, inetSocketAddress: InetSocketAddress, proxy: Proxy) 
        println("connectStart $inetSocketAddress $proxy")
      

      override fun secureConnectStart(call: Call) 
        println("secureConnectStart")
      

      override fun secureConnectEnd(call: Call, handshake: Handshake?) 
        println("secureConnectEnd $handshake?.cipherSuite")
        handshake?.peerCertificates?.forEach 
          println((it as X509Certificate).subjectDN)
        
      

      override fun connectEnd(call: Call, inetSocketAddress: InetSocketAddress, proxy: Proxy, protocol: Protocol?) 
        println("connectEnd")
      

      override fun connectFailed(
        call: Call,
        inetSocketAddress: InetSocketAddress,
        proxy: Proxy,
        protocol: Protocol?,
        ioe: IOException
      ) 
        println("connectFailed $ioe")
      
    )
    .build()

    val request = Request.Builder()
      .url("https://github.com/robots.txt")
      .head()
      .build()

    client.newCall(request).execute().use  response ->
      if (!response.isSuccessful) throw IOException("Unexpected code $response")
    

哪些输出

connectStart github.com/140.82.121.3:443 DIRECT
secureConnectStart
secureConnectEnd TLS_AES_128_GCM_SHA256
CN=github.com, O="GitHub, Inc.", L=San Francisco, ST=California, C=US
CN=DigiCert High Assurance TLS Hybrid ECC SHA256 2020 CA1, O="DigiCert, Inc.", C=US
CN=DigiCert High Assurance EV Root CA, OU=www.digicert.com, O=DigiCert Inc, C=US
connectEnd

需要注意的事情,可以有多个路线,如果第一个失败,可以尝试另一个。

【讨论】:

我正在寻求实现入队概念以及它如何在后面工作,因为我需要持续监控服务器。任何输入.. 它有据可查,在您尝试此操作并讨论一些代码之前很难回答这个一般性问题。【参考方案2】:

要检查服务器的可用性,您需要先建立到它的连接。

这个连接还应该包含一个有效的请求,这样你就可以检查你从服务器收到的答案,并确保你的请求到达了它并且没有在途中被阻止或重定向。

要知道什么样的请求是有效的,以及它是否需要凭据,您需要确切地知道您正在测试的特定服务器期望什么。

由服务器决定您是否需要任何凭据,以及总体而言,您需要向其发送什么以获得良好的响应。

okhttp 被认为是与 http 服务器通信的好库,但您可能还想检查进行测试的机器上互联网连接的有效性,以确保如果连接失败是由于服务器端而不是客户端。

okhttp 没有特定的实用程序来执行此操作,但是,根据您使用的平台,有两种可能的方法:

    使用平台特定的 API(例如 android 上的NetworkManager)检查设备是否有互联网连接。

    使用 okhttp 向可用性非常高的服务器(例如 google.com)发出请求,以查看您是否可以访问它。

这是一个带有示例代码的链接,用于使用 okhttp 发出 HTTP 请求:https://www.vogella.com/tutorials/JavaLibrary-OkHttp/article.html

他们甚至展示了提供凭据的一种可能方式,但同样 - 这取决于您尝试测试的服务器!

【讨论】:

所提供的 Web 链接未提供与凭据/身份验证和 ssl/tls/certificates 信息相关的任何信息。已经检查过了。由于找不到任何东西,所以在这里。

以上是关于使用 OkHttp java 进行远程服务器可用性检查的主要内容,如果未能解决你的问题,请参考以下文章

OkHttp全局拦截器设置token超时重新获取

okhttp 客户端何时缓存服务器响应?

java 使用Retrofit 1.9 + OkHttp 2.2进行Android响应缓存

Jaeger-3.实现一个分布式调用(OkHttp+SpringBoot)

使用 OkHttp 进行真实 HTTP 请求的 Robolectric 测试抛出 java.lang.NullPointerException:没有为 PKCS#12 KeyStore 提供密码

三、深入理解OkHttp:连接处理-ConnectIntercepter