-1

以下は、パラメーター java.net.Socket:getInputStream() として渡すメソッドです。

これは、ほぼ常に完全に機能します。

ソケットからの入力ストリームが空のバイト (あいまいなデータ) の大きなチャンクである場合に問題が発生します。これにより、プログラムが完全に応答しなくなります。誰が何が起こっているのか知っていますか?応答を停止するだけでなく、IOException などを取得しないようにする必要がありますか? たとえば、データが役に立たないあいまいな情報である場合、どうすれば読み取りを終了できますか。

public static String fromStream(InputStream in) throws IOException
{
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    StringBuilder out = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        out.append(line);
    }
    return out.toString();
}
4

2 に答える 2

4

ストリームに '00' バイトが含まれている場合、readLine() を使用してデータを読み取るのはおそらく間違っています。代わりにバイトを読み取る必要があります。

于 2013-01-22T12:06:36.000 に答える
1

64,000ドルの質問は、この「意味のないあいまいなデータ」とは何ですか?

それが本当に無意味であるならば、あなたはそれがなぜ送られているのかということに本当に集中するべきです。データを送信しているアプリケーションのバグが原因である可能性があります。それを見つけて修正すれば、クライアントコードを変更する必要はありません。

一方、それは意味のあるデータである可能性があります...しかし、あなた/あなたのアプリケーションはそれが何を意味するのかわかりません。その場合、根本的な問題は、ファイルがテキストファイルではないため、Reader/を使用して読み取ることが正しくないことBufferedReaderです。

このデータをテキストとして読み続けたい場合は、ゼロバイト/文字が悲しみを引き起こさないように、一度にBufferedReader1文字ずつ読み取る必要があります。ゼロ文字(または悪い文字)に遭遇すると、文字読み取りコードが無効になる可能性があります。それ以外の場合、実際に必要な場合は、不良でない文字を行にまとめます。


あなたのコメントから注意すべきことがいくつかあります:

私は基本的に通常の応答を期待していました。たとえば、HTTPサーバーから200、つまりOKを含めると、この例外的なケースでは、これらのゼロバイトが取得され、他には何も表示されません。

まず、プレーンソケットを使用してHTTPサーバーと対話しようとしているようです。これは悪い考えです。本当に悪い考えです!単純なソケットコードでは、コーシャHTTPサーバーが応答を送信する可能性のあるさまざまな方法を正しく解釈できない可能性があります。(そしてそれは次のことを説明するでしょう...)

次に、HTTP応答には、応答本文にメディアタイプを提供する「Content-type」が含まれています。クライアントがContent-typeヘッダーを無視すると、応答本文を間違った方法で処理するリスクがあります。たとえば、確かに多数のゼロバイトを含む可能性のあるPDFファイルまたはTARファイルを取得する場合があります。

一方、これらのことを正しい方法で実行している可能性があり、HTTPサーバーが壊れている可能性があります。

于 2013-01-22T12:33:36.283 に答える