我正在开发一个面向浏览器/代理的项目,我需要下载网页。在向Web服务器发送自定义HTTP请求后,我开始侦听服务器响应。
在阅读响应时,我会检查内容长度的响应头:-row。如果我得到其中一个,很容易确定服务器何时完成发送数据,因为我总是知道我收到了多少字节的数据。
当服务器不包含Content-Length标头并且还为进一步的请求保持连接打开时,会出现问题。例如,Google服务器以gzip-content响应,但不包含内容长度。我怎么知道何时停止等待更多数据并关闭连接?
我考虑过暂停一段时间没有收到数据时使用超时值来关闭连接,但这似乎是错误的方法。例如,Chrome可以下载与我相同的页面,并且似乎总是知道何时关闭连接。
答案 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
答案 1 :(得分:1)
我会建议您强制Connection: close
标头,以便在输出完成后确定服务器关闭连接,无论是否设置了Content-length
。性能将受到此
答案 2 :(得分:0)
您可以期待两种情况: 关闭插座 2.套接字超时
通常套接字将被关闭,声明套接字超时也是有意义的。
记住
int stream.read(byte[],size);
返回byte []的实际大小 - 在socket-close或socket-timeout(或达到size-argument)之前读取的参数大小。
问候。