我正在使用的库有问题。可能是图书馆的问题,也可能是我用错了!
基本上,当我这样做时(超时以毫秒为单位)
_ignitedHttp.setConnectionTimeout(1); // v short
_ignitedHttp.setSocketTimeout(60000); // 60 seconds
没有生成超时异常并且工作正常,但是,当我执行以下操作时,
_ignitedHttp.setConnectionTimeout(60000); // 60 seconds
_ignitedHttp.setSocketTimeout(1); // v short
我收到套接字异常。
所以,我的问题是为什么我不能模拟连接异常?我是否误解了套接字和连接超时之间的区别?该库位于here(尚未正式发布)。
仅在启动 TCP 连接时才会发生连接超时。如果远程计算机没有应答,通常会发生这种情况。如果您得到
ConnectException
,可能的原因是:服务器已关闭、您使用了错误的 IP/DNS 名称、错误的端口或与服务器的网络连接已关闭。
套接字超时专门用于监视连续传入的数据流。如果数据流中断指定时间,则连接被视为已停止/中断。当然,这仅适用于始终接收数据的连接,并且延迟不超过配置的套接字超时。
通过将套接字超时设置为 1000(毫秒),这将要求每秒接收一次新数据(假设您以块方式读取数据并且块足够大)。
如果仅传入流停止超过一秒,您就会遇到套接字超时。
当 HTTP 服务器处理复杂的请求(需要服务器端一段时间才能获得 HTTP 响应数据)时,这一点尤其重要。如果您将套接字超时配置为 10000(10 秒),但 HTTP 服务器在收到 HTTP 请求后需要 15 秒,那么您将永远不会收到响应,因为 10 秒后您将收到
SocketTimeoutException
(在接收 HTTP 请求之间没有数据传输) HTTP 请求,直到 HTTP 响应准备好)。
A 连接超时 是程序愿意等待建立与另一个进程的连接的最长时间。此时您没有获取或发布任何应用程序数据,只是建立连接本身。
A socket timeout 是等待单个数据包时的超时。一个常见的误解是套接字超时是接收完整响应的超时。因此,如果套接字超时为 1 秒,并且响应由 3 个 IP 数据包组成,其中每个响应数据包需要 0.9 秒才能到达,总响应时间为 2.7 秒,则不会出现超时。