如何知道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)之前读取的参数大小。
问候。
- 如何使用spring的MockMultipartHttpServletRequest? 得到“没有找到多部分边界”
- 为什么dispatch会抛出“java.net.ConnectException:General SSLEngine …”和特定URL的“意外状态”exception?
- 从HttpUrlConnection对象获取头
- 如何在java中的http post中发送json对象
- HttpClientBuilder – java.lang.NoSuchFieldError:INSTANCE
- GET HTTP请求有效负载
- UTF-8中的JAVA Http POST请求
- Java Spring作为基于Akka的REST HTTP调用的客户端
- 分析我的java代码发送的http流量的最佳方法?