`
chtq
  • 浏览: 14524 次
  • 性别: 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编写的简易HTTP服务器

    java编写的简易HTTP服务器

    java编写的迅雷下载器

    【Java编写的迅雷下载器】是一款基于Java编程语言实现的下载工具,它在功能上模仿了著名的迅雷下载器,提供了相似的用户界面和强大的下载能力。通过使用Java进行开发,这款开源软件展现了Java在网络编程领域的应用...

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

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

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

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

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

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

    java编写的一个简单bbs网站完整代码

    这是一个基于Java技术构建的简易BBS(Bulletin Board System,电子公告板)网站的完整源代码。这个项目非常适合Java初学者进行学习和研究,因为它提供了一个实际应用的基础框架,可以帮助理解Web开发的基本流程。 ...

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

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

    java代码编写规范

    Java程序员编写代码时应当遵循的一些基本规范

    java编写ATM柜员机模拟程序(GUI+javaSwing+MySQL).zip

    java编写的ATM模拟程序,GUI界面,连接Mysql数据库,实现了管理员界面(增删改查),用户界面(取款,存款,查询,安全退出,修改密码,转账,查询记录,导出记录),详情请看我的博客 ...

    Java SWT编写的黑白棋程序

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

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

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

    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编写的N皇后问题

    Java编写的N皇后问题是一个经典的计算机编程挑战,它涉及到回溯算法、递归以及问题解决策略。N皇后问题要求在N×N的棋盘上放置N个皇后,使得每个皇后都不能在同一行、同一列或同一斜线上。这个问题的解决方案数量...

    java编写的词法分析器

    1、该词法分析器要求至少能够识别以下几类单词: (1)关键字:else if int return void while共6个,所有的关键字都是保留字,并且必须是小写; (2)标识符:识别与C语言词法规定相一致的标识符,通过下列...

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

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

    java编写的博客网站源码

    【标题】:“Java编写的博客网站源码”指的是一个基于Java编程语言开发的博客系统,它通常包含了完整的前后端代码,用于实现一个功能完善的在线博客平台。这样的源码对于学习Java Web开发、J2EE技术栈以及理解博客...

    Java下载器的简单实现及实时进度和速度获取

    在Java编程领域,开发一个下载器是常见的任务,特别是对于处理大文件或网络资源时。本文将深入探讨如何实现一个简单的Java下载器,并且重点讲解如何实现下载的实时进度显示和速度计算。以下是对这个主题的详细阐述:...

    java访问https网址下载文件

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

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

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

Global site tag (gtag.js) - Google Analytics