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

时间:2012-02-23 12:19:02

标签: java http browser proxy webserver

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

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

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我会建议您强制Connection: close标头,以便在输出完成后确定服务器关闭连接,无论是否设置了Content-length。性能将受到此

的部分影响

答案 2 :(得分:0)

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

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

记住

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

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

问候。