当客户端使用readTimeout关闭连接时,服务器上会发生什么

时间:2016-02-10 07:48:06

标签: java sockets http tomcat java-ee

当客户端使用readTimeout关闭与API的连接时,服务器会发生什么。请求的执行将完成,否则一旦发生超时就会中断或执行完成,响应流被阻塞服务器应该发送给用户的响应

2 个答案:

答案 0 :(得分:4)

超时是一种不整洁的关闭连接的方式 - 当你的连接时间超时时,你很有可能告诉对方你已经超时了正在关闭连接。也就是说,双方的协调行动并没有正式关闭连接,只是一方决定将其视为死亡。

解决这个问题的方法是连接的两端都有超时 - 如果一方超时,另一方也会超时,最终。

至于服务器端究竟发生了什么:由于服务器在其自身超时到期之前不知道连接已经死亡,它会认为连接正常,并且通常会处理请求并尝试写入响应。可能会有一些缓冲响应,因此尝试编写响应甚至可能对服务器起作用。

当服务器尝试向响应写入足够的数据以填充可能的缓冲区时,它将阻塞,然后在发生超时时抛出异常,最后让服务器知道连接超时。

如果服务器没有用其响应填充缓冲区,则在尝试关闭连接时应该发生相同的(阻塞,然后异常)(但这可能已经发生在应用程序外部,在应用程序服务器容器中码)。

如果您在超时发生后最终尝试写入响应,那么您应立即获得异常。

那么在服务器上究竟发生了什么在很大程度上取决于你自己的代码:

  • 如果您在执行所有相关操作后仅写入响应,则会执行这些操作
  • 如果您混合业务逻辑和编写响应,可能会或可能不会执行某些逻辑(取决于您已经写入响应的数据量以及在什么时间),以及没有好的方法来估计将会发生什么

无论哪种方式,服务器最终都会知道发生了超时,但我不确定您的应用程序是否始终会获得此信息。

答案 1 :(得分:4)

  

当客户端使用readTimeout关闭与API的连接时,服务器上会发生什么。

如果客户因任何其他原因而关闭,会发生什么情况。服务器将继续执行请求,将成功写入响应的第一部分,并可能重置'写其余部分时出错,如果有休息,并且取决于时间和响应时间等等。

  

请求的执行是否完成

  

或一旦发生超时就会中断

没有

  

或执行将完成

  

并且响应流被服务器应该发送给用户的响应阻塞

是的,但这最终会导致重置连接错误。在服务器上。