【问题标题】:HttpURLConnection timeout defaultsHttpURLConnection 超时默认值
【发布时间】:2017-12-25 06:21:28
【问题描述】:

我似乎遇到了一些 tcp 请求有时会“卡住”的问题,比如它正在等待一些响应,但连接已“切断”,因此永远不会有响应。这是具有默认超时的 HttpURLConnection 的预期行为吗?是否设置了合理的默认值,这样我就不会在默认情况下陷入这种奇怪的“挂起”情况?

【问题讨论】:

    标签: java httpurlconnection


    【解决方案1】:

    HttpURLConnection 的“默认”超时似乎为零,这意味着“没有超时”。

    不幸的是,根据我的经验,使用这些默认值似乎会导致不稳定的状态,具体取决于您与服务器的连接发生的情况。如果您使用HttpURLConnection 并且没有明确设置(至少读取)超时,您的连接可能会进入永久陈旧状态。默认。因此,请始终将 setReadTimeout 设置为“某物”,否则您可能会孤立连接(可能还有线程,具体取决于您的应用程序的运行方式)。

    从反复试验看来,不需要调用setConnectTimeout,因为套接字本身似乎内置了 2 分钟的“连接超时”(至少在 OS X 中)。

    您还可以通过调整system properties 为超时设置“全局默认值”。

    修复/预测:始终设置 readTimeout(即使非常大),或使用其他客户端,让您设置 SO_KEEPALIVE。没有这些的默认值会导致线程在没有它的情况下“永远”挂起(当/如果他们进行读取时),或者在陈旧的套接字上永远存在......

    【讨论】:

    • 我觉得很奇怪的是,Java HTTP API 不会用无限设置覆盖默认的两分钟连接超时。如果操作系统基本上要使用系统设置,那么允许您设置读取或连接超时还有什么意义?
    • 默认值为 2 分钟,我相信你“可以”将其覆盖为无穷大(但根据我的经验,不应该!)
    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2012-05-05
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2019-07-29
    • 2011-01-31
    相关资源
    最近更新 更多