在请求第二个http GET命令获得第二个范围后,无法获得任何响应

时间:2012-03-18 18:40:28

标签: java http sockets httpresponse

我试图通过具体确定的范围获得整个txt文件范围。第一个请求已成功完成,但当我第二个请求接收第二个部分时,我无法得到任何响应,只是空值。缺少某些东西吗?我放了一个while循环来观察null之后是否会有任何值,但我看不到!

我没有为这个http套接字使用任何特殊的库。我只是创建一个带端口80的套接字和一个bufferedwriter(writer)和bufferedreader(reader)来与服务器通信。

这是整个方法。我已经更新了这个问题:

public static void rangedRequest(String host, String url, int totalPartNum, String outputFile) throws IOException{
    String headRequest = "HEAD " +url+" HTTP/1.1\r\n"
            + "Host: "+ host +"\r\n\r\n";

    Socket sock = null;
    BufferedWriter writer = null;
    BufferedReader reader = null;
    try {
        sock = new Socket(host, 80);
        writer= new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
        reader= new BufferedReader(new InputStreamReader(sock.getInputStream()));
    } catch (UnknownHostException ex) {
        System.out.println("ERROR:Unknown host");
        System.exit(0);
    }
    writer.write(headRequest);
    writer.flush();
    /***************Response**************/
    String response;
    int totalLength = 0;
    do{
        response = reader.readLine();
        if(response.indexOf("Content-Length") > -1){
            totalLength = Integer.parseInt(response.substring(response.indexOf(' ')+1));
            response = null;
        }
    }while(response != null);
    /****File Length infor is received****/
    BufferedWriter output = new BufferedWriter(new FileWriter(outputFile));
    int range = totalLength/totalPartNum;
    for (int i = 0; i < totalPartNum; i++) {
        String getRequest = "GET " + url + " HTTP/1.1\r\n" +            
                "Host: "+ host + "\r\n" + 
                "Range: bytes="+ i*range + "-" + ((i+1)*range -1) +
                "\r\n\r\n";                         //get range query
        writer.write(getRequest);
        writer.flush();
        boolean afterInfo = false;

        while(!reader.ready()){}
        do{       
            response = reader.readLine();
            if(response.indexOf("Range")>-1){       //After some information, there is an empty line and data
                afterInfo = true;                   //To understand info part is reached
            }                
        }while(!(response.length() < 1 && afterInfo));

        while(response != null){
            output.write(response);
            response = reader.readLine();
        }
    }
    sock.close();
}

1 个答案:

答案 0 :(得分:0)

每次向Http服务器发送新请求时,都要创建新套接字。因此,您需要重新构建sock,writer和reader,然后向Http服务器发出请求,最后关闭套接字并在循环中关闭其输入和输出流。