4

Java で単純なプロキシを作成しています。特定のリクエスト全体をバイト配列に読み取るのに問題があります。具体的には、次のループでは、クライアントが必要なすべてのデータを送信したにもかかわらず、'read' の呼び出しがブロックされます (つまり、ストリームの最後に到達することはありません)。入力全体を読み取るまで、出力を書き始める時期かどうか確信が持てないため、これが少し問題を引き起こしています。サーバーへの接続を切断すると、最終的にストリームの終わりに到達し、すべてが問題なく終了します (この場合は Firefox が www.google.com を要求しているクライアントからのすべてのデータがサーバーによって読み取られています)。 、必要に応じて処理できますが、明らかにクライアントに何も送り返すことはできません)。

public static void copyStream(InputStream is, OutputStream os) throws IOException
{
    int read = 0;
    byte[] buffer = new byte[BUFFER_SIZE];
    while((read = is.read(buffer, 0, BUFFER_SIZE)) != -1)
    {
      os.write(buffer, 0, read);
    }
    return;
}

InputStream は、クライアント ソケット (getInputStream() の後にバッファリング) から直接取得されます。OutputStream は ByteArrayOutputStream です。

私は何を間違っていますか?

4

3 に答える 3

4

通常、HTTP では、Content-Lengthヘッダーはストリームから読み取るデータの量を示します。\r\n基本的に、HTTP ヘッダーの終わりを示す二重改行 (実際には double- ) に続くバイト数を示します。詳細については、 W3Cを参照してください...

ヘッダーが送信されない場合Content-Lengthは、接続を介してデータが送信されずに一定時間が経過した後に読み取りを中断してみてください。

(私は、あなたが読んでいるデータを何らかの方法で処理しようとしていると仮定しています。そうでなければ、読んだときに各バイトを書き出すことができます)

于 2009-02-11T00:42:39.790 に答える
1

すべての接続にContent-Lengthヘッダーがあるわけではないことに注意してください。Transfer-Encoding: chunkedコンテンツの長さがエンコードされ、本文の一部として含まれている場所を使用している場合もあります。

于 2009-02-11T03:07:45.903 に答える