android ConnectionTimeout与SocketTimeout

uklbhaso  于 2023-06-04  发布在  Android
关注(0)|答案(2)|浏览(237)

我正在使用的库出现问题。可能是图书馆的问题,也可能是我用错了!
基本上,当我这样做时(以毫秒为单位的超时)

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

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

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

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

7uhlpewt

7uhlpewt1#

连接超时仅在启动TCP连接时发生。这通常发生在远程机器没有应答的情况下。如果您收到ConnectException,可能的原因是:服务器已关闭,您使用了错误的IP/DNS名称,错误的端口或到服务器的网络连接已关闭。
socket timeout专用于监控连续传入的数据流。如果数据流中断了指定的时间,则连接被视为停止/断开。当然,这只适用于一直接收数据的连接,并且没有比配置的套接字超时更长的延迟。

通过将套接字超时设置为1000,这将要求每秒接收一次新数据(假设您读取数据块并且块足够大)。
如果只有传入流停顿超过一秒,则您遇到了超时。
当HTTP服务器处理一个复杂的请求时,这一点尤其重要,因为在HTTP响应数据可用之前,服务器端需要一些时间。如果您将套接字超时配置为10000(10秒),但HTTP服务器在收到HTTP请求后需要15秒,那么您将永远不会收到响应,因为10秒后您将收到SocketTimeoutException(在HTTP请求的接收之间没有数据传输,直到HTTP响应就绪)。

2skhul33

2skhul332#

  • 连接超时 * 是程序愿意等待建立到另一个进程的连接的最大时间量。此时,您不会获取或发布任何应用程序数据,而只是建立连接本身。
  • socket timeout* 是等待单个数据包时的超时。一个常见的误解是套接字超时是接收完整响应的超时。因此,如果套接字超时为1秒,响应由3个IP数据包组成,每个响应数据包需要0.9秒到达,总响应时间为2.7秒,则不会出现超时。

相关问题