ConnectionTimeout与SocketTimeout

Rob*_*ert 120 java android tcp httpconnection

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

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

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds
Run Code Online (Sandbox Code Playgroud)

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

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short
Run Code Online (Sandbox Code Playgroud)

我得到一个Socket Exception.

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

Rob*_*ert 213

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

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

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

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

  • 这取决于 - 如果在服务器重载之前已建立TCP连接,您将收到套接字异常 - 否则您将获得连接异常,指示无法建立TCP连接. (9认同)
  • 如果服务器没有关闭但太忙,您是否会遇到连接超时的情况?或者这会是套接字超时吗? (2认同)
  • 考虑到特别旧的移动网络的高延迟,连接超时必须设置为几秒(例如 10 秒或更好的 10000 毫秒)。我只会在您不使用多个连接时设置套接字超时,因为 HTTP 可以在请求后重新使用连接。 (2认同)
  • @Robert如果服务器太忙,您不一定会获得连接异常。它取决于服务器平台上的平台。套接字读取超时不会终止连接。它只会导致SocketTimeoutException。连接是否仍然可用是应用程序必须做出的决定。关于API的肯定没有任何内容说明您不能在套接字上尝试更多的I / O。关于使用多个连接不使用超时的说法没有任何意义。这里的错误信息太多了。 (2认同)

ent*_*erd 74

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

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

  • 好的。1. 那么我们可以说 SocketTimeout 只有在连接已经建立时才会出现吗?2. 如果在收到 3 个数据包后 5 分钟内没有数据流怎么办?收到第 3 个数据包后会出现 SocketTimeout 异常吗? (4认同)
  • @SaurabhPatil 1. 是的。请参阅[维基百科的 HTTP 协议技术概述](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Technical_overview) 进行确认。2. 一旦发送完消息,就不需要进一步的数据,因此不会发生套接字超时。请参阅有关该主题的 [此答案](/sf/answers/337731691/)。 (4认同)
  • 我希望他们将“套接字超时”命名为“空闲超时”。 (3认同)