1

クライアント情報を取得し、サーバーに送信し、再度情報を受信するためのツール (プロキシ) を開発しています。また、サーバーから受信したデータをダンプしようとしています。inputStream の整数表現を読み取ることはできますが、文字列形式を読み取ることができません。以下の例を試してみましたが、ハングしてサーバーに接続しません。また、System.out.println(inputStream.nextLine()) は 1 行しか表示せず、ハングします。

public void run() {
   try {
       int i;
       while ((i = inputStream.read()) != -1){
           System.out.println(IOUtils.toString(inputStream));
           outputStream.write(i);
       }
   } catch (IOException e) {
       System.out.println("Lost connection to the client.");
   }
}
4

2 に答える 2

1
  1. 投稿したコードはサーバーへの接続を試行しませんが、いずれかが実行される場合は、既に接続している必要があります。
  2. プログラムがこのコードでハングしている場合は、サーバーがまだデータを送信していないか、IOUtils.toString()メソッドがおそらく EOS に読み取ろうとしている可能性があるため、ピアが接続を閉じない場合、ここで永久にブロックされます。
  3. プログラムが readLine() 呼び出しでハングした場合は、ピアが読み取る行を送信していないことを意味します。
于 2013-10-20T23:51:23.207 に答える
1

これについての私の推測では、入力ストリームから読み取っていて、IOUtils ライブラリを使用してストリームからも読み取っていると思います。あなたのアプリケーションは、入力ストリームから最初のバイトを読み取ってから、IOUtils ライブラリを使用して入力ストリームの残りを読み取ってから、読み取った最初のバイトを出力していると思われます。

ループ内から IOUtils.toString(inputstream) を呼び出しても意味がありません。そのメソッド呼び出しは、入力ストリームからのすべてのデータを文字列に入れます。この場合、なぜループが発生するのでしょうか。

これには IOUtils ライブラリを使用しないことをお勧めします。1 バイトのデータを読み取り、それを StringBuilder にプッシュして、そのバイトを出力するだけです。このアプローチでは、ループが必要であり、おそらく探しているものが得られるでしょう。

このようなことを試してください。ただし、必要に応じて変更して、データを同時に出力ストリームに出力します。

public static String inputStreamToString(final InputStream is, final int bufferSize)
{
  final char[] buffer = new char[bufferSize];
  final StringBuilder out = new StringBuilder();
  try {
    final Reader in = new InputStreamReader(is, "UTF-8");
    try {
      for (;;) {
        int rsz = in.read(buffer, 0, buffer.length);
        if (rsz < 0)
          break;
        out.append(buffer, 0, rsz);
      }
    }
    finally {
      in.close();
    }
  }
  catch (UnsupportedEncodingException ex) {
    /* ... */
  }
  catch (IOException ex) {
      /* ... */
  }
  return out.toString();
}
于 2013-10-21T02:57:33.787 に答える