JAVA互联网编程---用socket下载一个网站的图片存储到本地后打不开

简单介绍一下遇到的问题

用java中的socket类去下载一张网上的图片时,发现本地保存下来的文件并不能打开。

用记事本打开程序下载的和自己从网页上下载的图片进行对比。发现前者多出了服务器给我返回的响应头

图片应该是服务器返回的响应报文主体(关于HTTP请求响应报文网上有挺多资料的,可以了解一下)

下面说一下怎么去掉响应头。(顺带附一张响应报文格式的图片)


解决方案

首先得理解响应报文是由响应码+响应首部+空行(CR+LF)+报文主体  

很清晰发现报文主体和响应头(响应码+响应首部)是由一个空行存在的(实际上叫回车换行符),我们就以这个符来划分。

下面是划分的代码

 
 
int count, offset; byte[] buffer = new byte[2048]; boolean eohFound = false;
while ((count = IS.read(buffer)) != -1) {   offset = 0;   if(!eohFound)
    {        String string = new String(buffer, 0, count);       int indexOfEOH = string.indexOf("\r\n\r\n");       if(indexOfEOH != -1) {       count = count-indexOfEOH-4;
     offset = indexOfEOH+4;
eohFound = true;
      headersout.write(buffer,0,offset);
     }
    else
    {
     count = 0;
    }
}
  fout.write(buffer, offset, count);
  fout.flush();
}

参考文章

思路如下

将读入的数据重新写入一个字符串用来检测“回车换行符”。检测到了之后将offset置位到“回车换行符”之后

 
 
offset = indexOfEOH+4;

(接下来就不用转换为字符串了,可以直接以字节流写入本地)

总结

由于socket总是会先返回响应头,这对于很多文件的组成来说是多余的,要在读取中将这部分去掉或者写到另外的文件,不然会让文件无法打开。

扫描二维码关注公众号,回复: 891977 查看本文章

猜你喜欢

转载自blog.csdn.net/shell_q/article/details/80339302
今日推荐