URLConnection,为啥有两个不同的超时? (连接并阅读)[重复]

Posted

技术标签:

【中文标题】URLConnection,为啥有两个不同的超时? (连接并阅读)[重复]【英文标题】:URLConnection, why two different timeouts? (connect and read) [duplicate]URLConnection,为什么有两个不同的超时? (连接并阅读)[重复] 【发布时间】:2015-02-11 09:03:03 【问题描述】:

只是好奇。类 URLConnection 需要有两个不同的超时是否有充分的理由?

connectTimeout 是连接时等待的最长时间(以毫秒为单位)。如果在建立连接之前超时,连接到服务器将失败并返回 SocketTimeoutException。

readTimeout 是在放弃之前等待输入流读取完成的最长时间。如果在数据可用之前超时,读取将失败并抛出 SocketTimeoutException。

你能给我一个很好的理由为什么这两个值应该不同吗?为什么调用需要更多时间来执行连接而不是接收一些数据(反之亦然)?

我问这个是因为我必须配置这些值,我的想法是为两者设置相同的值。

【问题讨论】:

【参考方案1】:

连接超时是您准备等待从服务器获得某种响应的时间。这与您要达到的目标没有特别的关系。

但是假设你有一个服务可以让你给它一个很大的数字,并让它返回它的主要因素。服务器可能需要很长时间才能生成答案并将其发送给您。

您可能对服务器会快速响应连接有明确的期望:甚至这里的 5 秒延迟可能会告诉您服务器可能已关闭。但是读取超时可能需要更长的时间:可能需要几分钟才能读取服务器对查询的回答。

【讨论】:

【参考方案2】:

假设服务器很忙,并且配置为接受“N”连接,并且所有连接都是长时间运行的,突然你发送请求,会发生什么?你应该无限期地等待还是应该超时?那是connectTimeout。

虽然假设您的服务器将脑死服务变成了脑死服务,只是接受连接并且什么都不做(或者说服务器同步进入数据库并花费一些时间进行活动,并且服务器最终陷入死锁,例如),另一方面客户端保持在等待响应时,在这种情况下客户应该怎么做?它应该无限期地等待响应还是应该超时?那是读取超时。

【讨论】:

我至少有一个原因。我认为这个例子很好。【参考方案3】:

连接超时是您希望建立(在正常情况下 TCP)连接的超时。互联网 RFC 中指定并由各种操作系统实现的默认超时通常在分钟范围内。但是我们知道,如果服务器可用且可访问,它将在几毫秒内响应,否则根本不会响应。正常值最多为几秒钟。

读取超时是服务器在收到传入请求后预期响应的时间。因此,读取超时取决于您期望服务器交付结果的时间。这些取决于您发出的请求的类型,如果处理需要一些时间或服务器在某些情况下可能非常繁忙,则应该更大。特别是如果您在读取超时后重试,最好将读取超时设置得不要太低,通常是预期时间的 3-4 倍。

【讨论】:

以上是关于URLConnection,为啥有两个不同的超时? (连接并阅读)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 java.net.URLConnection 上指定本地地址?

如果部分写入参与超时块,为啥由 document.write 创建的文档呈现方式不同?

可以为Java Socket写消息设置超时吗

为啥两个相同的列表有不同的内存占用?

为啥两个 Uni V3 池有不同的字节码?

为啥在 Xcode 7 中的 Test Navigator 中有两个不同的测试?