URLConnection,为什么两个不同的超时? (连接和阅​​读)

时间:2014-12-12 15:50:47

标签: java timeout urlconnection

只是好奇心。有没有一个很好的理由为什么类URLConnection需要有两个不同的超时?

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

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

你能告诉我为什么这两个值应该有所不同吗?为什么呼叫需要更多时间来执行连接而不是接收一些数据(或反之亦然)?

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

3 个答案:

答案 0 :(得分:4)

我们假设服务器正忙,并且配置为接受N' N'连接和所有的连接是长跑步者,你突然发送请求,会发生什么?你应该无限期等待还是超时?那是connectTimeout。

虽然让我们说你的服务器只是接受连接并且不做任何事情(或者说服务器同步进入数据库,并且做一些时间进行活动,并且服务器最终导致例如死锁)并且在其他手持客户端一直在等待响应,在这种情况下客户端应该做什么?它应该无限期地等待响应还是应该超时?这是读取超时。

答案 1 :(得分:0)

连接超时是指您准备等待从服务器获得某种响应的时间。它与您尝试实现的目标并不特别相关。

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

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

答案 2 :(得分:0)

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

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