2016-05-14 8 views
0

BSDソケットapiを使用してクローラを作成するための実験室作業があるので、すべての応答を抽出するために複数のHTTP要求を作成する必要があります。シングルソケット接続で処理しようとしていましたが、ヘッダー、他の応答は空です。 はここに私のコードですので、解決策?:javaで同じソケット接続を使用して複数のHTTPリクエストを実行するにはどうすればよいですか?

Socket socket = new Socket("fucking-great-advice.ru", 80); 

    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    PrintWriter output = new PrintWriter(socket.getOutputStream()); 

    for (int numberAdvice = 1; numberAdvice < 100; numberAdvice++) { 
     output.write("GET /advice/" + numberAdvice + " HTTP/1.0\r\n\r\n"); 
     output.flush(); 

     StringBuilder sb = new StringBuilder(); 
     int ch = 0; 
     while ((ch = input.read()) != -1) { 
      sb.append((char) ch); 
     } 
     String response = sb.toString().split("\r\n\r\n")[1]; 
     System.out.println(response); 
    } 

    input.close(); 
    output.close(); 
    socket.close(); 
+1

[keep alive](https://en.wikipedia.org/wiki/HTTP_persistent_connection)で試したことがありますか? )? – Duffydake

答えて

1

彼らはあなたの現在のコードでは多くの問題が何であるか、次のとおりです。

  1. は、あなたがあなたのリクエストのヘッダーにhostを提供しないようエラー404が表示されます。
  2. -1が得られるまで、InputStreamを読み続けることになります。これは、サーバーのクエリを継続しようとするときに望むものではないストリームの終わり(ストリームが閉じた状態)になることを暗黙的に想定することを意味します。あなたがこのウェブサイトは、チャンクで結果を与えるとして、一度
  3. に答え、私たちはラインで応答ラインを読み、をチェックすることで、コードでそれを管理するために必要な接続を閉じる避けるためにサーバーを示すために、ヘッダConnection: keep-aliveを追加する必要が
  4. チャンクの開始と終了。

要求は次のようになります。ここでは

output.write(
    String.format(
     "GET /advice/%d HTTP/1.1\r\nHost: fucking-great-advice.ru\r\nConnection: keep-alive\r\n\r\n", 
     numberAdvice 
    ) 
); 
output.flush(); 

は、あなたが回答を読んで表示する方法です。

if (numberAdvice > 1) { 
    // Skip inter responses empty line 
    input.readLine(); 
} 
StringBuilder sb = new StringBuilder(); 
String line; 
boolean started = false; 
while ((line = input.readLine()) != null) { 
    if (!started) { 
     // Here we check if we reached the end of the header 
     if (line.isEmpty()) { 
      // Here the body starts 
      started = true; 
      // Skip chunk start 
      input.readLine(); 
     } 
     continue; 
    } 
    if ("0".equals(line)) { 
     // Reached chunk end 
     break; 
    } 
    sb.append(line); 
} 
System.out.println(sb); 

NB:このコードは、最適または完璧であることを意味しません

+0

私はあなたの答えをよりよく考えていたので、それは私の問題を解決しました。thnxたくさん –

+0

@PlacintaAlexandru良いニュース –

関連する問題