我正在用Java编写Web服务器,我希望它支持HTTP 1.1 Keep-Alive连接。但是,如何判断客户端何时发送给定连接的请求? (如双线或类似物)。

让我们看看stackoverflow如何处理这个非常模糊的问题 - 谷歌在技术规范和模糊语言中陷入困境的答案。我想要一个非C程序员的简明英语答案:)


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

有帮助吗?

解决方案

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

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

以较长篇的方式,实际考虑部分 HTTP / 1.1文档为您提供了一些指导:

  

“服务器通常会有一些   超出它们的超时值   不再保持不活跃状态   连接。代理服务器可能会   这是一个更高的价值,因为它很可能   客户将会做更多   通过同一服务器连接。   使用持久连接   对长度没有要求   这个超时的(或存在)   客户端或服务器。“

  

“当客户或服务器希望时   超时它应该发出一个优雅的   关闭运输连接。   客户端和服务器应该都是   不断地注视着对方   运输关闭,并回应它   作为适当的。如果是客户端或服务器   没有检测到对方的关闭   及时它可能导致不必要的   网络上的资源消耗。“

其他提示

  

让我们看看stackoverflow如何处理这个非常模糊的问题 - 谷歌在技术规范和模糊语言中陷入困境的答案。

我只是把到谷歌,第三个打击是HTTP Made Really Easy。在目录中,有一个链接指向持久连接和“ ;连接:关闭“头。这部分长达三段,使用非常简单的语言,并准确地告诉你你想知道什么。

  

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

在充分尊重的情况下,编程是一项技术性工作,细节非常重要。阅读技术文档是绝对必要的技能。依靠“普通英语”第三方对规范的解释只会导致你做得不好。

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top