如何知道HTTP服务器何时完成发送数据

我正在开发一个面向浏览器/代理的项目,我需要下载网页。 在向Web服务器发送自定义HTTP请求后,我开始侦听服务器响应。

在阅读响应时,我检查Content-Length的响应头:-row。 如果我得到其中一个,很容易确定服务器何时完成发送数据,因为我总是知道我收到了多少字节的数据。

当服务器不包含Content-Length标头并且还为进一步的请求保持连接打开时,会发生此问题。 例如,Google服务器以gzip-content响应,但不包含内容长度。 我怎么知道何时停止等待更多数据并关闭连接?

我已经考虑过在没有收到数据的情况下使用超时值来关闭连接,但这似乎是错误的方法。 例如,Chrome可以下载与我相同的页面,并且似乎总是知道何时关闭连接。

看看IETF RfC 2616,搜索分块编码和内容范围。

HTTP旨在返回未知长度的内容,如:

HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked 25 This is the data in the first chunk 1C and this is the second one 3 con 8 sequence 0 

来源维基百科

我会尝试建议你强制Connection: close标题,这样你就可以确保服务器在输出完成后关闭连接,无论是否设置了Content-length 。 性能将受到部分影响

您可以期待两种情况:1。套接字关闭2.套接字超时

通常套接字将被关闭,声明套接字超时也是有意义的。

记得

  int stream.read(byte[],size); 

返回byte []的实际大小 – 在socket-close或socket-timeout(或达到size-argument)之前读取的参数大小。

问候。