【发布时间】:2017-12-25 06:21:28
【问题描述】:
我似乎遇到了一些 tcp 请求有时会“卡住”的问题,比如它正在等待一些响应,但连接已“切断”,因此永远不会有响应。这是具有默认超时的 HttpURLConnection 的预期行为吗?是否设置了合理的默认值,这样我就不会在默认情况下陷入这种奇怪的“挂起”情况?
【问题讨论】:
我似乎遇到了一些 tcp 请求有时会“卡住”的问题,比如它正在等待一些响应,但连接已“切断”,因此永远不会有响应。这是具有默认超时的 HttpURLConnection 的预期行为吗?是否设置了合理的默认值,这样我就不会在默认情况下陷入这种奇怪的“挂起”情况?
【问题讨论】:
HttpURLConnection 的“默认”超时似乎为零,这意味着“没有超时”。
不幸的是,根据我的经验,使用这些默认值似乎会导致不稳定的状态,具体取决于您与服务器的连接发生的情况。如果您使用HttpURLConnection 并且没有明确设置(至少读取)超时,您的连接可能会进入永久陈旧状态。默认。因此,请始终将 setReadTimeout 设置为“某物”,否则您可能会孤立连接(可能还有线程,具体取决于您的应用程序的运行方式)。
从反复试验看来,不需要调用setConnectTimeout,因为套接字本身似乎内置了 2 分钟的“连接超时”(至少在 OS X 中)。
您还可以通过调整system properties 为超时设置“全局默认值”。
修复/预测:始终设置 readTimeout(即使非常大),或使用其他客户端,让您设置 SO_KEEPALIVE。没有这些的默认值会导致线程在没有它的情况下“永远”挂起(当/如果他们进行读取时),或者在陈旧的套接字上永远存在......
【讨论】: