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

What is the difference between setReadTimeout() and setConnectTimeout()?

很抱歉,如果这听起来是一个非常愚蠢的问题,但谷歌搜索了很长一段时间没有给出这个问题的答案。

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

clientHttpRequestFactory.setConnectTimeout(timeout);

但是,我看到还有另一种方法 setReadTimeout(),所以我不确定在收到服务器响应之前使用哪种方法设置超时是正确的。 HttpComponentsClientHttpRequestFactory 上的文档对此不是很清楚。

谁能解释一下这两种方法的区别?

编辑: 我的想法是,如果网络不可靠,我应该设置 setConnectTimeout() 并且服务器应该设置 setReadTimeout()不可靠。对吗?

ConnectTimeout是创建连接的超时时间。假设您有一个不可靠的服务器,您只想等待 15 秒就可以告诉用户 "something is wrong".

ReadTimeout 是连接时的超时,您在 read() 上被阻塞,如果读取阻塞超过 timeout,您希望获得异常。

现实生活中的例子是检查特定网站是否正常运行。唯一可靠的测试方法是尝试连接到它。您可能能够连接到它,它可能会拒绝您的连接,或者由于网络问题它只是挂在连接上。这就是连接超时的用武之地。

读取超时在应用程序协议中很有用,客户端需要每隔一段时间发送一个 "heartbeat",让他们知道他们仍然连接(如果服务器定期写回客户,这不是必需的,但情况并非总是如此)。您将使用心跳时间的读取超时(加上一些额外的),如果它超时,那么您可以假设客户端已断开连接并关闭套接字。