我正在用Java编写Web服务器,我希望它支持HTTP 1.1 Keep-Alive连接。但是,如何判断客户端何时发送给定连接的请求? (如双线或类似物)。
让我们看看stackoverflow如何处理这个非常模糊的问题 - 谷歌在技术规范和模糊语言中陷入困境的答案。我想要一个非C程序员的简明英语答案:)
我明白了。这证实了我怀疑不得不依赖于SocketTimeoutException。但是我不确定我是否可以从客户端依赖它来表明它已完成连接 - 这将允许我在大多数情况下更快地关闭连接 - 而不是等待超时。感谢
答案 0 :(得分:8)
如果您正在构建符合标准的服务器,那么您已经掌握了很多信息来指导您。
简单说,它应该基于自使用连接以来的时间,而不是基于请求数据的级别。
以较长的方式,HTTP / 1.1文档的practical considerations section为您提供了一些指导:
“服务器通常会有一些 超出它们的超时值 不再保持不活跃状态 连接。代理服务器可能会 这是一个更高的价值,因为它很可能 客户将会做更多 通过同一服务器连接。 使用持久连接 对长度没有要求 这个超时的(或存在) 客户端或服务器。“
或
“当客户或服务器希望时 超时它应该发出一个优雅的 关闭运输连接。 客户端和服务器应该都是 不断地注视着对方 运输关闭,并回应它 作为适当的。如果是客户端或服务器 没有检测到对方的关闭 及时它可能导致不必要的 网络上的资源消耗。“
答案 1 :(得分:4)
让我们看看stackoverflow如何处理这个非常模糊的问题 - 谷歌在技术规范和模糊语言中陷入困境的答案。
我只是将When should I close an HTTP 1.1 connection?放入Google,第三次点击是HTTP Made Really Easy。在目录中,有一个标题为Persistent Connections and the "Connection: close" Header的部分的链接。这部分长达三段,使用非常简单的语言,并准确地告诉你你想知道什么。
我想要一个非C程序员的简明英语答案:)
在充分尊重的情况下,编程是一项技术性工作,细节非常重要。阅读技术文档是绝对必要的技能。依靠“普通英语”第三方对规范的解释只会导致你做得不好。
答案 2 :(得分:1)
你随时关闭它。标头表示客户端希望您保持连接打开,但这不需要服务器遵守。大多数服务器将其打开大约5-10秒,有些服务器根本不关注它。
答案 3 :(得分:1)
您应该阅读处理Keep-Alive功能的RFC。否则,您可能最终得到的服务器无法按预期工作。
正如@ [Stephen]已经指出的那样,服务器可以随时随地关闭连接(好吧,不是在请求/响应对的中间)。同样适合客户。任何其他解决方案都允许服务器或客户端在另一方执行DoS。
编辑:看一下Connection标题。客户端(和服务器)可以使用标头请求正常的连接关闭。例如,请求中的Connection: close
是服务器在发送响应后关闭连接的请求。