2008-09-26 220 views
7

我正在用Java编写一个Web服务器,我希望它支持HTTP 1.1 Keep-Alive连接。但是,如何知道客户端何时完成了给定连接的请求? (就像是一个双线结束的东西)。如何知道何时关闭HTTP 1.1保持连接?

让我们来看看stackoverflow如何处理这个非常模糊的问题 - 在Google上,这些问题都被技术规范和模糊语言所困扰。我想要一个非C程序员的简单英语答案:)


我明白了。这证实了我不得不依赖SocketTimeoutException的怀疑。但我不确定是否有一些我可以从客户端获得的信息表明它已完成连接 - 这可以让我在大多数情况下更快地关闭连接 - 而不是等待超时。谢谢

回答

8

如果您正在构建符合标准的服务器,那么您已经有很多信息来指导您。

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

在一个较长的长篇大论方式,HTTP的practical considerations section/1.1的文档对你有一些指导:

“的服务器通常会有一些 超时值超出他们将 不再保持非活动 连接。代理服务器可能会使 这更高的价值,因为它很可能 客户端将通过同一个服务器进行更 连接。 的持续连接 地方没有要求在 的长度 (或存在),这个超时为 客户端或服务器。“

“当一个客户端或服务器希望 超时它应该发出优美 关闭传输连接上。 客户端和服务器应该都在 时刻关注 的另一端运输关闭,并在适当的时候回应 。如果客户端或服务器 没有检测到对方的亲密 及时可能会导致网络上的不必要的 资源流失“

1

你随时都可以关闭它。标题表示客户希望您断开连接,但不要求服务器遵守。大多数服务器将其打开约5-10秒,有些根本不关注它。

1

您应该阅读处理Keep-Alive功能的RFC。否则,您最终可能会遇到无法正常工作的服务器。作为@ [Stephen]已经指出,服务器可以随时关闭连接,只要它希望(好吧,不在请求/响应对中间)。同上给客户。任何其他解决方案都将允许服务器或客户端在另一方执行DoS。

编辑:看看连接标题。客户端(和服务器)可以使用标头请求正常的连接关闭。例如,Connection: close里面的请求是服务器发送响应后关闭连接的请求。

+0

我想问的原因是,大多数Web浏览器(特别是所有我曾与测试者)的持续发出“连接:保持活动”头即使在所有的的CSS/.js文件/ etc文件已经请求并收到。我想也许他们比我更聪明,我错过了一些东西。 – Bret 2008-09-26 17:56:04

+0

浏览器更愿意保持连接的打开状态,因为如果需要向同一台服务器发送更多请求,则会增加响应时间。没有什么能够防止服务器在每次请求后忽略Keep-Alive功能并关闭连接。 – Alexander 2008-09-26 18:06:03

3

让我们来看看计算器如何处理这个非常模糊的问题 - 答案为此,在谷歌,深陷在技术规格和晦涩的语言。

我只是把When should I close an HTTP 1.1 connection?到谷歌和三分命中为HTTP真的变得容易。在内容表中,有一个名为Persistent Connections and the "Connection: close" Header部分中的链接。 这个 部分长三段,使用非常简单的语言,并告诉你到底你想知道什么。

我想对于非C程序员的纯英语答案:)

恕我直言,编程是一个技术性的努力,其中的细节问题很大。阅读技术文档是绝对必要的技能。依靠“简单英语”对规范的第三方解释只会导致你做得不好。