2012-02-23 57 views
3

我正在致力于浏览器/代理服务的项目,我需要下载网页。在将自定义HTTP请求发送到Web服务器后,我开始监听服务器响应。如何知道HTTP服务器何时完成发送数据

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

当服务器不包含Content-Length标头并且还将连接保持打开状态以便进一步请求时,就会出现问题。例如,谷歌服务器响应gzip-content,但不包括内容长度。我如何知道何时停止等待更多数据并关闭连接?

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

回答

2

查看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 

source Wikipedia

+0

这似乎是正确的解决方法,如果这也适用于压缩数据。 (我假设它是这样做的,因为我在一些缺少Content-Length的请求中看到了Transfer-Encoding:头部)。谢谢! – Accatyyc 2012-02-23 12:34:22

1

我会试着建议你强制Connection: close标题,所以无论Content-length是否设置,您都确信服务器在输出完成后关闭连接。性能将部分受此影响

+0

感谢您的回答。这是我已经尝试过的,但许多服务器忽略了这一点,所以它不是傻瓜式的。另外,如果查看Chrome发送的请求,可以看到它始终使用连接:保持活动状态,但仍然知道何时完成。因此,我认为这是(即使它有时会起作用)解决问题的错误方法。 – Accatyyc 2012-02-23 12:27:03

+0

如果服务器忽略连接:关闭然后你有一个很大的麻烦,需要使用一个非常短的超时(如2秒)。 Connection:close要求服务器关闭连接。不关闭连接是违反协议。此外,我可能怀疑Chrome预计标签确定“已完成” – 2012-02-23 12:34:05

+0

我不这么认为,因为在解压缩之前阅读压缩文档的HTML标签是没有意义的。看看bew的答案。 Chrome通过读取块大小来解决这个问题。 – Accatyyc 2012-02-23 12:42:29

0

有两种情况,你可以期望: 1.插座靠近 2.插座超时

通常插座将被关闭,这也是有道理的申报插座时间到。

记住

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

返回字节[]的真实大小 - 已读,直到插座接近或套接字超时(或大小参数达到)参数的大小。

问候。

相关问题