2017-09-30 17 views
0

私はJavaソケットプログラミング(Apache HTTPクライアントまたはその他のAPIではなく)を使用するJavaを使用してカールのようなプログラムを作成しようとしています ユーザへのリクエストを受け取ったときの応答の全体または唯一のボディを表示します。現在、次のコードを思い付いた:verboseオプションがオンの場合分離リクエストを取得する応答ソケットをJavaソケットプログラミング

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     String t; 
     while ((t = br.readLine()) != null) { 
      if (t.isEmpty() && !parameters.isVerbose()) { 
       StringBuilder responseData = new StringBuilder(); 
       while ((t = br.readLine()) != null) { 
        responseData.append(t).append("\r\n"); 
       } 
       System.out.println(responseData.toString()); 
       parameters.verbose = false; 
       break; 
      } else if(parameters.isVerbose())// handle output 
       System.out.println(t); 
     } 
     br.close(); 

、それが迅速に動作し、1秒未満で全体のレスポンスボディを示しています。しかし、私はメッセージの本文を持っていたいとき、それを手渡すには時間がかかりすぎる(約10秒)。 どのように高速に処理することができますか? ありがとうございます。

+0

ちょうどコメント:コードの構造は非常に奇妙です。内側のループでストリーム全体を消費するため、外側のループは非冗長なケースでは役に立たないからです。また、変数名を修正することもできます( 's'と' t'は明示的な名前ではありません)。 – Dici

+0

冗長スイッチがコード内の別の場所でアクティブになっている可能性はありますか?それは、あなたが一度だけ大文字小文字の 'Connection:close'のようなヘッダーを送るように見えるが、他のケースではないようだ。 – blafasel

+0

@blafaselまったく同じデータとブール値の違いで試しました。私が全部を印刷しているとき、それは完璧かつ高速に動作します。しかし、データだけを処理するときにはかなり遅くなります! – Fezo

答えて

0

私はあなたが何かを意味すると仮定するつもりですが、それは何かをすぐに表示し始めますが、長い間印刷行を続けます。コンソールへの書き込みには時間がかかり、各行を無作為に印刷していますが、もう一方のコードパスでは、最初にレスポンス全体をメモリに保存してからコンソールにフラッシュします。

冗長応答がメモリに収まるのに十分小さければ、同じことを行う必要があります。そうでなければ、バッチで印刷する任意の数の行を決定することができます(つまり、n行をメモリに蓄積し、コンソール、StringBuilderをクリアし、繰り返します)。

私の提案を実装するもっともエレガントな方法は、をラップしてBufferedOutputStream、それ自身をラップすることです。System.outです。すべての私のコメントやアドバイスは、次のスニペットに凝縮されています

private static final int BUFFER_SIZE = 4096; 

public static void printResponse(Socket socket, Parameters parameters) throws IOException { 
    try (BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     PrintStream printStream = new PrintStream(new BufferedOutputStream(System.out, BUFFER_SIZE))) { 

     // there is no functional difference in your code between the verbose and non-verbose code paths 
     // (they have the same output). That's a bug, but I'm not fixing it in my snippet as I don't know 
     // what you intended to do. 
     br.lines().forEach(line -> printStream.append(line).append("\r\n")); 
    } 
} 

それはあなたが知らない任意の言語構造を使用している場合は、さらに質問をして自由に感じます。

+0

ありがとうございます。実際には、何も表示されずに何も表示されず、すべてが一緒に来ます! そして、冗長と非冗長の出力が異なります。 1つは応答全体を示し、もう1つは応答で受信したデータのみを示しています。 – Fezo

+0

体を取得する方法は、残りの応答から空白行でボディーを区切ることです。その部分は体を取り出すためのものです。 – Fezo

+0

@Fezoコードに違いはありません。両方の場合にすべての行を表示します(非冗長の場合は最初の行を除きますが、空の場合に限ります)。 – Dici

関連する問題