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