如果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
方法是阻塞的,所以它应该等到流中的所有字节都可用并成功读取。
答案 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;
}