`
chtq
  • 浏览: 14511 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
我用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();

	}

}

分享到:
评论
3 楼 Laynepeng 2009-08-02  
try this:

http://hc.apache.org/httpclient-3.x/
2 楼 chtq 2009-08-02  
beckrabbit 写道
http下载程序 干嘛要用socket建立连接?

那要怎么做比较好,我是因为看到关于socket发送HTTP请求的文章才想到用socket读取数据。
beckrabbit可以给个思路吗?
1 楼 beckrabbit 2009-08-02  
http下载程序 干嘛要用socket建立连接?

相关推荐

    JAVA编写的打砖块程序源代码

    JAVA编写的打砖块程序源代码 ; JAVA编写的俄罗斯方块程序源代码 ; JAVA编写的计算器程序源代码 ; JAVA编写的看图软件程序源代码 ; JAVA编写的螃蟹过街程序源代码 ; JAVA编写的拼图---键盘操作程序源代码 ; JAVA编写...

    java编写的ftp文件实时监控下载上传

    用java语言编写的ftp小工具,可以按指定时间监控ftp服务器,把服务器指定目录内新产生的文件或者文件夹下载到本地指定文件夹,下载后删除数据。 也可以监控本地文件夹,把文件夹内新产生的文件或者文件夹整体上传到...

    java源码包---java 源码 大量 实例

     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...

    用java编写的科学计算器

    在这个场景中,我们关注的是一个特定的项目——一个用Java编写的科学计算器。科学计算器不仅具备基本的四则运算,还提供更高级的数学功能,如对数、指数、三角函数、复数运算等,对于学习者和专业人士来说非常实用。...

    Java编写的仿windows自带计算器程序(源代码)

    用Java编写的仿windows自带计算器程序的源代码,可用任何文本编辑器打开。 从界面到功能80%与windows计算器程序一致,适合GUI编程初学者学习。 技术特点:OOP思想,MVC,内部类。

    JAVA编写的计算器程序源代码

    JAVA编写的打砖块程序源代码 ; JAVA编写的俄罗斯方块程序源代码 ; JAVA编写的计算器程序源代码 ; JAVA编写的看图软件程序源代码 ; JAVA编写的螃蟹过街程序源代码 ; JAVA编写的拼图---键盘操作程序源代码 ; JAVA编写...

    一个java编写的简易计算器源码 实现简单的加减乘除

    一个java编写的简易计算器源码 老师布置的作业,实现简单的加减乘除

    一个简单的日记本程序 JAVA编写

    这个是一个日记本程序,主要目的是用来记录一些技术方面的信息。包括网络上的,还有其他方面获得的信息。这个都存储在数据库中。本程序由Java编写。IDE为Netbeans6.7.1 OS为Ubuntu9.10

    Java SWT编写的黑白棋程序

    采用Java SWT/Jface编写的黑白棋程序,没有绑定虚拟机,需要Java运行环境

    java聊天程序--用java编写的聊天程序,具有聊天界面,可以实现两两之间的对话

    免费分享~用java编写的聊天程序,具有聊天界面,可以实现两两之间的对话。使用GUI和socket以及多线程,聊天软件是学习java的一个极好的练手工具。

    java eclipse 编写的简单计算器(界面编程)

    在Java编程环境中,Eclipse是一个广泛使用的集成开发环境(IDE),尤其适合进行Java应用程序和Web应用的开发。在这个项目中,我们关注的是如何利用Eclipse创建一个简单的图形用户界面(GUI)计算器。这个计算器能够...

    JAVA 编写的 License生成器(JAVA源码+运行bat)

    1. JAVA 编写的 License生成器 2. 采用rsa非对称密钥算法。 3. 打包成jar直接运行。 4. 自动创建明文txt文件,修改后进行一键加密,生成License文件。 5. 优秀的界面操作。 6. 具有较好的不可复制性。

    java使用HttpClient通过url下载文件到本地

    综上所述,通过Java的HttpClient库,可以在Eclipse环境中编写程序,实现从指定URL下载文件到本地的功能。通过理解HttpClient的工作原理和提供的API,开发者可以构建出稳定、高效的文件下载解决方案。

    Java Servlet编写Json自定义数据接口

    在Java Web开发中,Servlet扮演着服务器端处理HTTP请求的角色,能够生成响应数据并返回给客户端。本教程将专注于使用Servlet来编写JSON自定义数据接口,这是一种将Java对象转换为JSON格式,并通过HTTP服务提供数据的...

    java编写的LR语法分析器(编译原理实验)

    java编写的LR语法分析器(编译原理实验) 本实验是基于java语言实现的LR语法分析器,旨在演示编译原理中的LR语法分析技术。LR语法分析器是编译原理中的一种重要技术,用于分析和识别源代码中的语法结构。 LR语法...

    java访问https网址下载文件

    本篇将详细介绍如何在Java中实现这一功能,特别是在遇到需要下载证书的情况。 首先,你需要引入Java的HTTPS相关的库,这通常包含在`javax.net.ssl`包中。Java的`HttpURLConnection`类是处理HTTP和HTTPS请求的基础,...

    java编写的APS(高级排产系统)

    吐血上传,这可是全球著名IT公司ILog的APS高级排产优化引擎,就连SAP、Oracle等ERP中的物料需求计划与生产...希望版主能给我几千分,我也想参考一下这里的几个系统。下面还会有销售性线预测系统与运输车辆优化系统。

    java编写的简单的资源管理器

    该课程设计报告里的简易记事本程序是使用Java程序设计语言编写的,要求实现记事本的基本功能,参考了windows中记事本的一些功能。要求打开文件,读取文件中的文本信息;显示、编辑修改文本信息;实现新建、打开、...

    JAVA编写的FTP客户端和服务器

    用java编写的FTP服务器、客户端。服务器底层采用apache FTPserver的JAR包。客户端底层采用sun.net包。两者都可以独立使用。在myeclipse10.6里面编写,java版本是1.6。

    129个Java项目源码下载 [共分20个压缩卷] 【13】.zip

    关于压缩包子文件的文件名称列表,由于只给出了"129个Java项目源码下载 [共分20个压缩卷] 【13】"这一项,我们无法得知具体包含哪些项目,但可以预期的是,这个压缩卷中可能包含几个到十几个不等的Java项目,每个...

Global site tag (gtag.js) - Google Analytics