Ans*_*jee 1 .net vb.net networkstream stream
如果 messageBytes.Length 足够大(例如大约 30,000),则 Stream.Read 读取的字节数比预期少。
Using stream As New Net.Sockets.NetworkStream(socket)
networkStream.Read(messageBytes, 0, messageBytes.Length)
End Using
Run Code Online (Sandbox Code Playgroud)
MSDN 的文档在其备注部分声明了这一点
即使尚未到达流的末尾,实现也可以自由地返回比请求更少的字节。
我能够在 while 循环中读取它,读取单个字节,直到到达所需的位置,例如
Dim position = 0
While position < messageBytes.Length
stream.Read(messageBytes, position, 1)
position += 1
End While
Run Code Online (Sandbox Code Playgroud)
问题是任何人都可以说出为什么实施允许这样做吗?我认为该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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
589 次 |
最近记录: |