通过 BinaryReader 从 NetStream 读取的正确方法是什么?
What is the correct way to read from a NetStream through a BinaryReader?
我了解到,如果您想从网络流中读取 X 字节,请执行以下操作:
netStream.Read(buffer, 0, X);
在所有情况下都不够,因为读取可能只是 X 的 return 部分,因此您需要循环直到读取字节数等于 X。
然而,另一个示例将 NetStream 包装在 BinaryReader br 中,然后继续:
br.Read(buffer, 0, X);
我的问题是:
由于 NetStream 现在被 BinaryReader 包装这一事实是否有效,或者我们是否仍需要考虑读取可能不会 return 所有 X 字节和循环,就像读取一样来自原始网络流?
BinaryReader.Read(byte[], int, int)
只是将调用转发到基础流。语义是相同的。然而,对于这种情况,还有辅助方法 BinaryReader.ReadBytes(int)
读取特定数量的字节,因此您不必自己跟踪读取了多少字节。
我是这样工作的:
using (NetworkStream netStream = new NetworkStream(...))
using (BinaryReader br = new BinaryReader(netStream))
{
byte x;
do
{
try
{
x = br.ReadByte();
}
catch (EndOfStreamException exception)
{
x = Byte.MinValue;
}
} while (x != byte.MinValue);
}
我了解到,如果您想从网络流中读取 X 字节,请执行以下操作:
netStream.Read(buffer, 0, X);
在所有情况下都不够,因为读取可能只是 X 的 return 部分,因此您需要循环直到读取字节数等于 X。
然而,另一个示例将 NetStream 包装在 BinaryReader br 中,然后继续:
br.Read(buffer, 0, X);
我的问题是:
由于 NetStream 现在被 BinaryReader 包装这一事实是否有效,或者我们是否仍需要考虑读取可能不会 return 所有 X 字节和循环,就像读取一样来自原始网络流?
BinaryReader.Read(byte[], int, int)
只是将调用转发到基础流。语义是相同的。然而,对于这种情况,还有辅助方法 BinaryReader.ReadBytes(int)
读取特定数量的字节,因此您不必自己跟踪读取了多少字节。
我是这样工作的:
using (NetworkStream netStream = new NetworkStream(...))
using (BinaryReader br = new BinaryReader(netStream))
{
byte x;
do
{
try
{
x = br.ReadByte();
}
catch (EndOfStreamException exception)
{
x = Byte.MinValue;
}
} while (x != byte.MinValue);
}