setReadTimeout()和setConnectTimeout()有什么区别?

9

非常抱歉,如果这个问题听起来很愚蠢,但是我已经搜索了相当长的时间,也没有找到这个问题的答案。

我正在尝试为我与服务器建立的连接设置超时时间,我正在使用 HttpComponentsClientHttpRequestFactory 并尝试按照以下方式设置超时时间:

clientHttpRequestFactory.setConnectTimeout(timeout);

然而,我发现还有另一种方法setReadTimeout(),所以我不确定在从服务器获取响应之前设置超时的正确方法是哪一个。关于HttpComponentsClientHttpRequestFactory的文档并不是非常清楚。
有人能解释一下这两个方法的区别吗? 编辑: 我的想法是,如果网络不可靠,我应该设置setConnectTimeout(),当服务器不可靠时,应该设置setReadTimeout()。这正确吗?

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.html#setConnectionRequestTimeout-int- - Ravindra babu
1个回答

18

ConnectTimeout 是创建连接的超时时间。比如说你有一个不可靠的服务器,你想在告诉用户“出了问题”之前等待15秒钟。

ReadTimeout 是当你已经建立连接,在read()中被阻塞并且希望在读取超过 timeout 的时间后获得异常。

现实生活中的例子可能是检查某个网络站点是否正常运行。唯一可靠的测试方式是尝试连接到它。你可以连接到它,它可能会给你连接拒绝,或者由于网络问题而挂起。这时就需要使用连接超时。

在应用程序协议中,如果客户端需要定期发送“心跳”来让服务器知道它们仍然连接着(如果服务器定期向客户端回写,这是不必要的,但并非总是如此),那么读取超时就很有用了。你将使用心跳时间(加上一些额外的时间)作为读取超时时间,如果超时,则可以假定客户端已断开连接并关闭套接字。


为了理解连接/读取超时,我参考了HTTP-Session-Flow。然后检查了您的答案,除了最后一段之外都很清楚。所以,通过readTimeout,您是指请求-响应之间的超时吗?此外,是否有可能使用像Charles这样的工具来阻止请求一段时间以检查这种情况? - CoDe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接