来源:
http://blog.csdn.net/superhosts/article/details/8737434
http://bbs.csdn.net/topics/390384017
对于http的请求返回结果要进行内容的长度校验主要有两种方式:
1.客户端在http头(head)加Connection:keep-alive时,服务器的response是Transfer-Encoding:chunked的形式,通知页面数据是否接收完毕,例如长连接或者程序运行中可以动态的输出内容,例如一些运算比较复杂且需要用户及时的得到最新结果,那就采用chunked编码将内容分块输出。
2.除了如1所述之外的情况一般都是可以获取到Content-Length的。
Content-Length如果存在并且有效的话,则必须和消息内容的传输长度完全一致。(经过测试,如果过短则会截断,过长则会导致超时。)
如果存在Transfer-Encoding(重点是chunked),则在header中不能有Content-Length,有也会被忽视。
-----------------------------------------------------------------------------------------------------
Transfer-Encoding: chunked的意思是:一边读数据,一边发给客户端。不是一下传输。会带这个头信息。
Content-Length:则是,服务器内已经缓存了哪个说句,一下发送给客户端会带这个头信息。
情况是这样的,服务端是动态生成的,你在数据很小的时候,没超过服务器的buffer大小的情况下
HTTP的header还没传输过来,能够把Content-Length传输过来。
在数据的大小超过buffer的情况下,服务器必须将HTTP Header和Entity(数据)flush到客户端,这个时候,entity大小仍然未知,所以没有Content-Length。