ConnectionTimeout与SocketTimeout

时间:2011-09-09 10:48:54

标签: java android tcp httpconnection

我正在使用我正在使用的库。它可能是图书馆,也可能是我使用它错了!

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

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

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

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

我收到了一个Socket Exception。

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

2 个答案:

答案 0 :(得分:194)

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

套接字超时专用于监控连续的传入数据流。如果数据流在指定的超时时间内中断,则认为连接已停止/损坏。当然,这仅适用于始终接收数据的连接。

通过将套接字超时设置为1,这将要求接收每毫秒的新数据(假设您已经读取数据块并且块足够大)!

如果只有传入的流停顿超过一毫秒,则表示您正在超时。

答案 1 :(得分:65)

连接超时是程序愿意等待建立与另一个进程的连接的最长时间。此时您无法获取或发布任何应用程序数据,只需建立连接本身。

套接字超时是等待单个数据包时的超时。一个常见的误解是套接字超时是接收完整响应的超时。因此,如果套接字超时为1秒,响应由3个IP数据包组成,每个响应数据包需要0.9秒才能到达,总响应时间为2.7秒,则不会超时。