简单介绍一下遇到的问题
用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;
headersout.write(buffer,0,offset);
}
offset = indexOfEOH+4;eohFound = true;
headersout.write(buffer,0,offset);
}
else
{
count = 0;
}
}
fout.write(buffer, offset, count);
fout.flush();
}
}
}
fout.write(buffer, offset, count);
fout.flush();
}
思路如下
将读入的数据重新写入一个字符串用来检测“回车换行符”。检测到了之后将offset置位到“回车换行符”之后
offset = indexOfEOH+4;
(接下来就不用转换为字符串了,可以直接以字节流写入本地)
总结
由于socket总是会先返回响应头,这对于很多文件的组成来说是多余的,要在读取中将这部分去掉或者写到另外的文件,不然会让文件无法打开。
扫描二维码关注公众号,回复:
891977 查看本文章