NetworkStream读取的字节数少于预期



如果messageBytes.Length足够大(比如大约30000),那么流。读取读取的字节数少于预期。

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

MSDN上的文档在其备注部分中声明了这一点

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

我能够在一段时间内读取它,循环读取单个字节,直到到达所需的位置,就像一样

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

问题是,有人能说出为什么实现允许这样做吗?我认为Stream.Read方法是阻塞的,所以它应该等到流中的所有字节都可用并成功读取。

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

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

不过,您不需要逐字节读取它,即:

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;
}

最新更新