当客户端使用readTimeout关闭与API的连接时,服务器会发生什么。请求的执行将完成,否则一旦发生超时就会中断或执行完成,响应流被阻塞服务器应该发送给用户的响应
答案 0 :(得分:4)
超时是一种不整洁的关闭连接的方式 - 当你的连接时间超时时,你很有可能告诉对方你已经超时了正在关闭连接。也就是说,双方的协调行动并没有正式关闭连接,只是一方决定将其视为死亡。
解决这个问题的方法是连接的两端都有超时 - 如果一方超时,另一方也会超时,最终。
至于服务器端究竟发生了什么:由于服务器在其自身超时到期之前不知道连接已经死亡,它会认为连接正常,并且通常会处理请求并尝试写入响应。可能会有一些缓冲响应,因此尝试编写响应甚至可能对服务器起作用。
当服务器尝试向响应写入足够的数据以填充可能的缓冲区时,它将阻塞,然后在发生超时时抛出异常,最后让服务器知道连接超时。
如果服务器没有用其响应填充缓冲区,则在尝试关闭连接时应该发生相同的(阻塞,然后异常)(但这可能已经发生在应用程序外部,在应用程序服务器容器中码)。
如果您在超时发生后最终尝试写入响应,那么您应立即获得异常。
那么在服务器上究竟发生了什么在很大程度上取决于你自己的代码:
无论哪种方式,服务器最终都会知道发生了超时,但我不确定您的应用程序是否始终会获得此信息。
答案 1 :(得分:4)
当客户端使用readTimeout关闭与API的连接时,服务器上会发生什么。
如果客户因任何其他原因而关闭,会发生什么情况。服务器将继续执行请求,将成功写入响应的第一部分,并可能重置'写其余部分时出错,如果有休息,并且取决于时间和响应时间等等。
请求的执行是否完成
是
或一旦发生超时就会中断
没有
或执行将完成
是
并且响应流被服务器应该发送给用户的响应阻塞
是的,但这最终会导致重置连接错误。在服务器上。