NetworkStream读取的字节数少于预期

时间:2015-11-28 14:12:27

标签: .net vb.net stream networkstream

如果messageBytes.Length足够大(比如大约30,000),那么stream.Read读取的字节数比预期的少。

Using stream As New Net.Sockets.NetworkStream(socket)
    networkStream.Read(messageBytes, 0, messageBytes.Length)
End Using

MSDN上的documentation备注部分

中声明了这一点
  

实现可以自由返回比请求的字节更少的字节   如果尚未到达流的末尾。

我能够在读取单个字节的while循环中读取它,直到达到所需的位置,如

Dim position = 0
While position < messageBytes.Length
    stream.Read(messageBytes, position, 1)
    position += 1
End While

问题是,任何人都可以告诉为什么实施允许这个?我认为Stream.Read方法是阻塞的,所以它应该等到流中的所有字节都可用并成功读取。

1 个答案:

答案 0 :(得分:3)

它会阻塞,直到可以读取某些数据。如果您在数据到达时对其进行处理,这一点非常重要。例如,如果您要将数据写入文件,您也可以立即开始编写,而不是等到所有数据都下载完毕。

它还可以处理比内存中更多的数据。

你不需要每字节读取一个字节,即:

public byte[] ReadFixedLength(this Stream stream, int length)
{
    byte[] buffer = new byte[length];
    int offset = 0;
    while (length > 0)
    {
        int read = stream.Read(buffer, offset, length);
        if (read == 0)
        {
            throw new EndOfStreamException();
        }

        offset += read;
        length -= read;
    }

    return buffer;
}