chen_tq 2009-08-02 21:49
浏览 313
已采纳

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();

}

}


问题补充
beckrabbit 写道
http下载程序 干嘛要用socket建立连接?

那要怎么做比较好,我是因为看到关于socket发送HTTP请求的文章才想到用socket读取数据。
beckrabbit可以给个思路吗?
  • 写回答

4条回答 默认 最新

  • iteye_14985 2009-08-02 22:20
    关注

    用标准的URLConnection类即可,如:

    [code="java"]
    try {
    String url="http://www.yahoo.com";

    URL u = new URL( url );
    URLConnection uc = u.openConnection();
    HttpURLConnection huc= (HttpURLConnection) uc;

    InputStream inp = uc.getInputStream();

    int l = 0;
    while ( l>=0 )
    {

    l=inp.read( b, 0, SIZE);
    if ( l>0 ) {
    String s=new String( b, 0, l );
    System.out.print( s );
    }
    }

    inp.close();
    }
    catch ( Exception e )
    { System.out.println( e.toString() );
    }[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)