java上用socket访问http,遇到没有Content-Length的头部,read阻塞要很久

cx2889 2014-10-27 06:08:54
发送了对应的http请求头给服务器后 ;
就等服务器返回了 ;
服务器先返回了http的应答头 ;
因此只能通过readline或者read一个一个地读 ;
最后遇到 \r\n 之后表示头部已经读完了 ;
例如:

HTTP/1.1 200 OK
Date: Mon, 27 Oct 2014 09:11:39 GMT
Content-Type: application/xhtml+xml;charset=utf-8
Content-Length: 1528
Connection: Keep-Alive
Cache-Control: no-cache
Content-Encoding: gzip
X-Powered-By: HPHP
Server: apache
traceid: 1414401099045611930610476067223373565521

然后分析这个头 ;
找到Content-Length ;
根据Content-Length把剩下的数据读完 ;
然后关闭socket

这样就很快完成对网站数据的读取了 ;

但是一旦遇到这样的应答头 ;

HTTP/1.1 200 OK
Content-Type: application/xhtml+xml;charset=utf-8
Transfer-Encoding: chunked
Connection: Keep-Alive
Vary: Accept-Encoding
Cache-Control: no-cache
Date: Mon, 27 Oct 2014 09:11:41 GMT
Server: apache
Version: HTTP/1.1
X-Powered-By: PHP/5.3.2
traceid: 141440110105425612908963065955238395687
Content-Encoding: gzip

头里面没有Content-Length ;
只能一直read ;
read到-1出现
所以等了好久才结束 ;
输出数据看了一下 ;
其实很早就把数据读完了 ;
但是read一直阻塞直到-1 ;
这个时间要很长 ;
对于这样的问题要怎么解决? ;

浏览器能够很好地读 , 但是我写的怎么就不行了呢
...全文
466 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cx2889 2014-11-01
  • 打赏
  • 举报
回复
引用 2 楼 u011564172 的回复:
当响应头没有Content-Length时,取而代之的是Transfer-Encoding: chunked,你可以看一下,chunked的意思是一边读数据,一边发给客户端,而不是一下传输,所以速度很慢,这不是你的原因,服务端的原因
恩恩, 百度过Transfer-Encoding: chunked , 终于知道怎么处理没有Content-Length的问题了... 只要判断是不是已经读取到"0\r\n\r\n"就知道是不是已经读取完了
Mr_JieLQ 2014-10-29
  • 打赏
  • 举报
回复
当响应头没有Content-Length时,取而代之的是Transfer-Encoding: chunked,你可以看一下,chunked的意思是一边读数据,一边发给客户端,而不是一下传输,所以速度很慢,这不是你的原因,服务端的原因
Magical茏 2014-10-27
  • 打赏
  • 举报
回复
http协议 底层的 不太熟

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧