论坛首页 Java企业应用论坛

JAVA编写HTTP下载遇到难题了,望各位给个思路

浏览 1736 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2009-08-02  
我用Java 编写了一个HTTP下载的程序,通过Socket建立链接,发送请求和接收文件。现在在接收文件的时候出现了问题,接收的数据中包含了HTTP响应信息,即:
HTTP/1.1 200 OK
Date: Sun, 02 Aug 2009 08:49:22 GMT
Server: Apache/2.2.11 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8k DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
Last-Modified: Thu, 04 Jun 2009 15:36:14 GMT
ETag: "78878f-49e-46b87893bd780"
Accept-Ranges: bytes
Content-Length: 1182
Connection: close
Content-Type: text/plain


我想把这段过滤掉,因为这不是文件本身应有的数据,各位有什么好的方法吗?

我试过的方法:附加的代码中方法download()。把读取的字节流转成字符串,判断两个“回车换行”的位置,取子字符串再转成字节保存。虽然这方法能把把这段响应信息过滤掉,但是打开文件显示已损坏,我想应该是转为字符串时编码出了问题,导致再转回字节时出了问题。



附上我的源代码,请各位给个思路
package net;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Arrays;
import java.util.List;

public class HTTPDownload {
	
	/**
	 * 过滤响应字符串;
	 */
	public static void download() throws IOException{
		//建立Socket链接
		Socket socket = new Socket("www.chentaoqian.com",80);
		//构造请求字符串
		StringBuffer sb = new StringBuffer();
		sb.append("GET ").append("/test.rar ").append("HTTP/1.1\r\n");
		sb.append("Host:www.chentaoqian.com\r\n");
		sb.append("Accept:*/*\r\n");
		sb.append("User-Agent:GeneralDownloadApplication\r\n");
		sb.append("Connection:close\r\n\r\n");
		
//		System.out.println("send command.");
		//发送请求
		OutputStream socketOut = socket.getOutputStream();
		socketOut.write(sb.toString().getBytes());
		socket.shutdownOutput();
		
//		System.out.println("start receive.");
		//开始接收数据
		InputStream socketIn = socket.getInputStream();
		ByteArrayOutputStream buffer = new ByteArrayOutputStream();
		byte[] buff = new byte[1024];
		int len = -1;
		boolean flag = false;	//标识是否已完成响应信息过滤;true-完成,false-未完成
		String temp = "";
		while((len=socketIn.read(buff))!=-1){
			if(flag == false){
				//过滤响应信息;
				//因为响应信息出现在响应流的一开始并且以两个回车换行结束("\r\n\r\n"),所以以此做判断;
				temp += new String(buff);
				if(temp.indexOf("\r\n\r\n") != -1){
//					buff = temp.substring(temp.indexOf("\r\n\r\n")+4).getBytes();
//					len = buff.length;
					buffer.write(buff, temp.indexOf("\r\n\r\n"), temp.substring(temp.indexOf("\r\n\r\n")+4).getBytes().length);
					flag = true;
				}
				
				continue;
			}else{
				buffer.write(buff,0,len);
			}
		}
		
		System.out.println(buffer.toString());
		//将数据写入文件保存;
		File f = new File("./aaaa.rar");
		FileOutputStream fos = new FileOutputStream(f);
		buffer.writeTo(fos);
		fos.close();
		socketIn.close();
		socketOut.close();
		socket.close();
		System.out.println("文件保存到:"+f.getAbsolutePath());
	}
	
	/**
	 * 没有过滤响应字符串;
	 */
	public static void download2() throws IOException{
		//建立Socket链接
		Socket socket = new Socket("www.chentaoqian.com",80);
		//构造请求字符串
		StringBuffer sb = new StringBuffer();
		sb.append("GET ").append("/test.rar ").append("HTTP/1.1\r\n");
		sb.append("Host:www.chentaoqian.com\r\n");
		sb.append("Accept:*/*\r\n");
		sb.append("User-Agent:GeneralDownloadApplication\r\n");
		sb.append("Connection:close\r\n\r\n");
		
//		System.out.println("send command.");
		//发送请求
		OutputStream socketOut = socket.getOutputStream();
		socketOut.write(sb.toString().getBytes());
		socket.shutdownOutput();
		
//		System.out.println("start receive.");
		//开始接收数据
		InputStream socketIn = socket.getInputStream();
		ByteArrayOutputStream buffer = new ByteArrayOutputStream();
		byte[] buff = new byte[1024];
		int len = -1;
		while((len=socketIn.read(buff))!=-1){
			buffer.write(buff,0,len);
		}
		
//		System.out.println(buffer.toString());
		//将数据写入文件保存;
		File f = new File("./aaaa2.rar");
		FileOutputStream fos = new FileOutputStream(f);
		buffer.writeTo(fos);
		fos.close();
		socketIn.close();
		socketOut.close();
		socket.close();
		System.out.println("文件保存到:"+f.getAbsolutePath());
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {

		HTTPDownload.download();
//		HTTPDownload.download2();

	}

}

   发表时间:2009-08-02  
http下载程序 干嘛要用socket建立连接?
0 请登录后投票
   发表时间:2009-08-02  
beckrabbit 写道
http下载程序 干嘛要用socket建立连接?

那要怎么做比较好,我是因为看到关于socket发送HTTP请求的文章才想到用socket读取数据。
beckrabbit可以给个思路吗?
0 请登录后投票
   发表时间:2009-08-02  
try this:

http://hc.apache.org/httpclient-3.x/
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics