9

NetworkStream の上で BinaryReader を使用して、ネットワークからデータを読み取っています。これは私にとっては非常にうまく機能しましたが、舞台裏で何が起こっているのかを理解したいので、BinaryReader のドキュメントを調べたところ、非常にまばらであることがわかりました。

私の質問は次のとおりです:を呼び出したときにネットワーク ストリームにバイトが存在しないBinaryReader.ReadBytes(bufferSize)場合はどうなりますか?bufferSizeReadBytes

私の考えでは、いくつかのオプションがあります:
1)ネットワークストリームに存在するバイトを読み取り、その数だけを返す
2)ストリームにバイトが存在するまで待ってからbufferSize読み取る
3)例外をスローする

例外を受け取ったことがなく、すべてのデータが断片ではなく完全に受信されるため、オプション 2 が発生していると思います。ただし、何が起こっているのかを確実に知りたいです。誰かが私を啓発することができれば、私は感謝します.

4

2 に答える 2

12

私はそれが実際に隠されたオプション4に当てはまると信じています:

  • 通常手動で行うのと同じ方法でループ処理を行い、データが利用可能になったら読み取ります。読み取り中にストリームの最後に到達した場合、要求したバイト数よりも少ない値のみが返されます。

これは、データが利用可能になるとストリームを排出するため、オプション 2 とは微妙に異なります。一度にすべてのデータを読み取ることができるまで待機しません。

最後に到達した場合に、要求したよりも少ないバイト数を返すことを示すのは簡単です。

var ms = new MemoryStream(new byte[10]);
var readData = new BinaryReader(ms).ReadBytes(100);
Console.WriteLine(readData.Length); // 10

すべてのデータを返すために複数の呼び出しを明示的に必要とするカスタム ストリームがなければ、ループ部分を証明するのは困難です。Read

ドキュメントはそれほど明確ではありませんが、戻り値の部分は少なくともある程度役立ちます。

基になるストリームから読み取られたデータを含むバイト配列。ストリームの終わりに達した場合、これは要求されたバイト数よりも少ない場合があります。

私がハイライトした最後の部分に注意して、それと比較してStream.Readください:

バッファーに読み取られた合計バイト数。これは、要求されたバイト数が現在利用できない場合は要求されたバイト数より少なくなる場合があり、ストリームの終わりに達した場合はゼロ (0) になります。

正確な量のデータを期待しており、その量だけが有用である場合は、ストリームが閉じられる前に提供されたストリームよりも多くのデータが必要な場合ReadExactlyに呼び出しReadてスローするメソッドを作成することをお勧めします。EndOfStreamException

于 2012-05-30T05:49:08.877 に答える
0

「ストリームに存在する」ことにより、指定されたバイト数が使用可能になるまでメソッドがブロックするかどうかを尋ねる場合、それはオプション2です。ストリームの終わりがに達した。

BinaryReader.ReadBytes(int)実装方法に関するサンプルコードを次に示します。

byte[] ReadBytes(int count)
{
    byte[] buffer = new byte[count];
    int total = 0;
    int read = 0;

    do
    {
        read = stream.Read(buffer, read, count - total);
        total += read;
    }
    while (read > 0 && total < count);

    // Resize buffer if smaller than count (code not shown).

    return buffer;
}
于 2012-05-30T05:40:22.323 に答える