2012-03-18 5 views
1

私は具体的に決定された範囲で全体のtxtファイルの範囲を取得しようとしています。 1回目のリクエストは正常に完了しましたが、2回目のリクエストを受け取ると2回目のリクエストを受信すると、応答が得られませんでした。何かが欠けていますか?私はnull値の後に値が来るかどうかを観察するためにwhileループを入れますが、私は見ることができませんでした!2番目の範囲を取得するために2番目のhttp GETコマンドを要求した後、応答が得られませんでした

私はこのhttpソケットに特別なライブラリを使用していません。私はちょうどポート80とbufferedwriter(ライター)とbufferedreader(リーダー)とサーバーと通信するソケットを作成します。

これはすべての方法です。

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

完全なリクエスト/応答ヘッダペアとレスポンスボディを投稿できますか? – moodywoody

+0

私は質問 – Shnkc

答えて

0

新しいリクエストをHttpサーバーに送信するたびに、新しいソケットを作成します。そのため、ソケット、ライター、リーダーを再構築し、Httpサーバーに要求を行い、最後にソケットを閉じてループ内の入出力ストリームをシャットダウンする必要があります。

+0

を更新しましたが、HTTP 1.0ではなくHTTP 1.1を使用しています。なぜ私はこれを行う必要がありますか? – Shnkc

関連する問題