Dar*_*dro 8 .net c# networking binaryreader
我在NetworkStream上使用BinaryReader从网络中读取数据.这对我来说非常有用,但我想了解幕后发生了什么,所以我看了一下BinaryReader的文档,发现它非常稀疏.
我的问题是:BinaryReader.ReadBytes(bufferSize)如果bufferSize我打电话时网络流上没有字节会怎么办ReadBytes?
在我看来,有几个选项:
1)读取网络流上存在的任何字节,只返回那么多
2)等待直到bufferSize流上出现字节,然后读取
3)抛出异常
我假设选项2正在发生,因为我从未收到任何例外,我的所有数据都是全部收到的,而不是碎片.但是,我想知道发生了什么.如果有人能够启发我,我将不胜感激.
Jon*_*eet 11
我相信它实际上是隐藏的选项4:
这与您的选项2略有不同,因为它会在数据可用时耗尽流 - 它不会等到它可以一次读取所有数据.
很容易证明它确实返回的字节数少于你要求的字节数,如果它到达结尾:
var ms = new MemoryStream(new byte[10]);
var readData = new BinaryReader(ms).ReadBytes(100);
Console.WriteLine(readData.Length); // 10
Run Code Online (Sandbox Code Playgroud)
如果没有自定义流明确需要多次Read调用来返回所有数据,那么很难证明循环部分.
文档不是很清晰,但返回值部分至少有些帮助:
包含从基础流读取的数据的字节数组.这可能小于达到流末尾时请求的字节数.
请注意我突出显示的最后一部分,并将其与Stream.Read以下内容进行比较:
读入缓冲区的总字节数.如果当前没有多个字节可用,则这可能小于请求的字节数,如果已到达流的末尾,则可以小于零(0).
如果您期望获得确切数量的数据并且只有该数量有用,我建议您编写一个ReadExactly方法,如果您需要的数据比关闭之前提供的数据流更多,则会调用Read和抛出EndOfStreamException.
| 归档时间: |
|
| 查看次数: |
5092 次 |
| 最近记录: |