8

我正在用 Java 编写一个 Web 服务器,我希望它支持 HTTP 1.1 Keep-Alive 连接。但是我如何知道客户端何时完成了对给定连接的发送请求?(比如双行尾之类的)。

让我们看看 stackoverflow 如何处理这个非常晦涩的问题——在 Google 上,这些问题的答案都陷入了技术规范和晦涩难懂的语言中。我想要一个非 C 程序员的简单英语答案:)


我懂了。这证实了我不得不依赖 SocketTimeoutException 的怀疑。但我不确定我是否可以从客户端依赖某些东西来表明它已完成连接——这将允许我在大多数情况下更快地关闭连接——而不是等待超时。谢谢

4

4 回答 4

8

如果您正在构建您的服务器以满足标准,那么您已经有很多信息可以在这里指导您。

简单来说,它应该基于使用连接后的时间,而不是请求数据级别。

HTTP/1.1 文档的实际考虑部分为您提供了一些指导:

“服务器通常会有一些超时值,超过该值它们将不再保持非活动连接。代理服务器可能会将此值设置为更高,因为客户端可能会通过同一服务器建立更多连接。使用持久化连接对客户端或服务器的此超时的长度(或存在)没有要求。”

或者

“当客户端或服务器希望超时时,它应该在传输连接上发出正常关闭。客户端和服务器都应该不断地观察传输关闭的另一端,并在适当的时候做出响应。如果客户端或服务器没有及时检测到对方的关闭,这可能会导致网络上不必要的资源消耗。”

于 2008-09-26T17:52:38.607 回答
3

让我们看看 stackoverflow 如何处理这个非常晦涩的问题——在 Google 上,这些问题的答案都陷入了技术规范和晦涩难懂的语言中。

我只是把我应该什么时候关闭一个 HTTP 1.1 连接?进入谷歌,第三次点击是 HTTP 变得非常容易。在目录中,有一个链接指向名为Persistent Connections 和“Connection: close” Header的部分。本节长三段,使用非常简单的语言,并准确地告诉您您想知道的内容。

我想要一个非 C 程序员的简单英语答案:)

With all due respect, programming is a technical endeavour where the details matter a great deal. Reading technical documentation is an absolutely essential skill. Relying on "plain English" third-party interpretations of the specifications will only result in you doing a poor job.

于 2008-09-26T18:13:17.077 回答
1

您可以随时关闭它。标头表明客户端希望您保持连接打开,但这并不要求服务器遵守。大多数服务器将其打开大约 5-10 秒,有些则根本不注意它。

于 2008-09-26T17:33:14.877 回答
1

您应该阅读有关 Keep-Alive 功能的 RFC。否则,您最终可能会得到一台无法按预期工作的服务器。

正如@[Stephen] 已经指出的那样,服务器可以随时关闭连接(好吧,不是在请求/响应对的中间)。对客户来说也是如此。任何其他解决方案都将允许服务器或客户端对另一方执行 DoS。

编辑:看看 Connection 标题。客户端(和服务器)可以使用标头请求优雅的连接关闭。例如,Connection: close请求内部是一个请求服务器在发送响应后关闭连接。

于 2008-09-26T17:43:25.337 回答