После запроса 2-й команды http GET, чтобы получить 2-й диапазон, не удалось получить ответ - PullRequest
1 голос
/ 18 марта 2012

Я пытаюсь получить весь диапазон текстовых файлов по диапазону, который конкретно определен. 1-й запрос успешно завершен, но когда я делаю второй запрос на получение второй части, я не смог получить никакого ответа, только нули. Чего-то не хватает? Я поместил цикл while, чтобы наблюдать, будет ли какое-либо значение после нулей, но я не мог видеть!

Я не использую никакой специальной библиотеки для этого сокета http. Я просто создаю сокет с портом 80 и буферизованным писателем (писателем) и буферизованным читателем (читателем) для связи с сервером.

Это весь метод. Я обновил вопрос:

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 голосов
/ 21 марта 2012

Создать новый сокет, каждый раз, когда вы отправляете новый запрос на Http-сервер.Так что вам нужно восстановить sock, writer и reader, затем выполнить запрос к серверу Http и, наконец, закрыть сокет и завершить его входной и выходной потоки в цикле.

...