HTTP:发送请求后写入的关闭套接字?

时间:2012-01-13 19:04:43

标签: http sockets

发送请求后,HTTP客户端使用的套接字如何正确关闭?或者它是否必须保持开放(双向)直到收到完整的答复?如果是这样,请求主体的结束如何由服务器确定?

根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4,关闭套接字不是请求的选项。这对我来说听起来不合逻辑 - 如果客户端在关闭其一半的套接字后没有尝试传输任何内容,为什么半封闭的TCP连接会成为服务器的问题?毕竟客户端仍然可以接收数据。

在我看来,关闭套接字的写入部分将是一种让服务器知道请求已经完成的非常实用的方法。 http://docs.python.org/howto/sockets.html#disconnecting甚至特别提到了用例。

如果真是错误的做法,那么替代方案是什么?我是否真的总是必须发送“内容长度”或使用分块传输来使服务器正确地找到请求的结束?对于体长未知的请求,它如何工作?

2 个答案:

答案 0 :(得分:1)

你在谈论这个吗?:

  

关闭连接不能用于指示请求正文的结束,因为这样就不会让服务器发回响应。

我认为文本正在谈论全面关闭,你可以做一半(写) - 关闭。我不确定这是一种HTTP编译方式,但我认为大多数服务器都会接受它。

关于第二个问题,只需使用分块编码:

  

接收实体的所有HTTP / 1.1应用程序必须接受“分块”传输编码(第3.6节),因此当无法事先确定消息长度时,允许将此机制用于消息。

答案 1 :(得分:1)

Transfer-Encoding: chunked专门设计用于允许发送具有未知正文长度的数据,用于请求和响应。通过接收有效负载大小为0的块来确定数据的结尾。如果您不发送chunked请求,则必须发送Content-Length