ConnectionTimeout与SocketTimeout


135

我正在使用的库有问题。可能是图书馆,也可能是我使用错误!

基本上,当我这样做时(以​​毫秒为单位)

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

没有超时异常会生成,并且可以正常工作,但是,当我执行以下操作时,

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

我收到一个套接字异常。

所以,我的问题是为什么我不能模拟连接异常?我是否误解了套接字和连接超时之间的区别?该库在这里(尚未正式发布)。

Answers:


227

一个连接超时仅在启动TCP连接发生。如果远程计算机不应答,通常会发生这种情况。这意味着服务器已关闭,您使用了错误的IP / DNS名称,错误的端口或与服务器的网络连接已关闭。

套接字超时是专用于监视连续输入的数据流。如果数据流在指定的超时时间内中断,则该连接被视为已停止/断开。当然,这仅适用于一直接收数据的连接。

通过将套接字超时设置为1,这将需要每毫秒接收到新数据(假设您明智地读取了数据块并且该块足够大)!

如果仅传入流停滞超过一毫秒,则说明您正在超时。


1
如果服务器未关闭但正忙,您能否获得连接超时?还是那是一个套接字超时?
罗伯特

9
这取决于-如果在服务器超载之前已建立TCP连接,则将收到套接字异常-否则,您将获得连接异常,表明无法建立TCP连接。
罗伯特

2
考虑到特别是较旧的移动网络的高延迟,必须将连接超时设置为几秒钟(例如10s或更短的10000毫秒)。我只会在不使用多个连接的情况下设置套接字超时,因为HTTP可以在请求后重新使用该连接。
罗伯特

1
这是否意味着如果您设置了套接字超时(例如1分钟),那么该连接将在1分钟不活动后被终止,因为如果没有设置超时,通常它将被重用?
罗伯特

2
@Robert如果服务器太忙,您不一定会获得连接异常。它与平台有关,取决于服务器平台。套接字读取超时不会终止连接。它只会导致SocketTimeoutException。连接是否仍然可用是应用程序必须做出的决定。关于API的肯定没有任何内容表明您不能在套接字上尝试更多的I / O。关于使用多个连接不使用超时的声明开始变得没有意义。这里的错误信息太多。
罗恩侯爵

83

一个 连接超时是程序愿意等待安装到另一个进程的连接的最大时间量。此时,您尚未获取或发布任何应用程序数据,仅是建立了连接本身。

一个套接字超时是等待单个数据包时超时。一个常见的误解是套接字超时就是接收完整响应的超时。因此,如果套接字超时为1秒,并且一个响应包含3个IP数据包(每个响应数据包需要0.9秒到达),总响应时间为2.7秒,那么将没有超时。


3
好的。1.那么我们可以说SocketTimeout仅在连接已经建立时才会出现吗?2.如果收到3个数据包后5分钟内没有数据流,该怎么办?收到第三个数据包后,会有SocketTimeout异常吗?
Saurabh Patil'7

2
@SaurabhPatil 1.是。有关确认,请参见Wikipedia的HTTP协议技术概述。2.一旦发送完消息末尾,就不再需要其他数据,因此套接字超时不会发生。请参阅有关主题的此答案
2016年

7
我希望他们将“套接字超时”命名为“空闲超时”。
Manish Maheshwari
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.