`
chtq
  • 浏览: 14609 次
  • 性别: 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编写学生信息管理系统java编写学生信息管理系统java编写学生信息管理系统java编写学生信息管理系统java编写学生信息管理系统java编写学生信息管理系统

    用java编写的象棋游戏

    总之,开发一个用Java编写的象棋游戏涉及到棋子类的设计、棋盘的实现、游戏逻辑控制、用户界面创建以及可能的AI对战模块。这个项目不仅可以锻炼编程技能,还能深入了解对象导向设计、图形用户界面编程以及人工智能...

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

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

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

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

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

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

    50个java编写的实战项目

    这里是50个java编写的实战项目,很适合想加强自己能力的人学习的,毕竟学习之后还是靠实践,这个真的很有用的,可以按需所求来寻找合适自己的项目去做。

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

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

    java代码编写规范

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

    用Java编写的军棋游戏

    用JAVA编写的一个Stratego游戏,类似于国内的军棋游戏,能够实现网络对战。附上源代码,编写类似游戏的同学可以借鉴借鉴。 PS:用eclipse运行出现错误:HelpFrame cannot be resolved to a type. 望高手解答。

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

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

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

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

    java编写的学生宿舍管理系统

    《Java编写的全面学生宿舍管理系统》 在信息技术日益发展的今天,高效的学生宿舍管理已经成为高校教育管理中的重要一环。本文将深入探讨一个基于Java编程语言开发的学生宿舍管理系统,该系统功能完善,内置原始...

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

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

    Java编写的N皇后问题

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

    java编写的词法分析器

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

    java访问https网址下载文件

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

Global site tag (gtag.js) - Google Analytics