【问题标题】:BinaryReader C# - Check if there are bytes leftBinaryReader C# - 检查是否有剩余字节
【发布时间】:2023-03-09 06:28:01
【问题描述】:

我想知道是否有任何方法或属性可以让我们查看与BinaryReader 关联的流中是否有可用字节可供读取(在我的情况下,它是 NetworkStream,因为我正在执行 TCP沟通)。 我已经检查了documentation,我看到的唯一方法是PeekChar(),但它只检查是否有下一个字节(字符),所以如果有很多字节要读取,制作一个while循环到增加一个计数器可能是无效的。

关于TCP通信,问题是TCP背后的应用协议不是我定义的,我只是想弄清楚它是如何工作的!当然会有一些“长度字段”会给我一些关于要读取的字节的线索,但我知道我只是在检查它是如何工作的,这个问题浮现在我脑海中。

【问题讨论】:

  • TCP 是一种流式协议...不确定您的意思,但lengthstreaming 的定义几乎相反。 BinaryReader 只是协议流的封装。
  • 嗯...对不起,我不明白你的意思!
  • 如果现在没有任何字节可用,你打算怎么做?这并不意味着没有更多的未来......
  • TCP 流的具体问题是,一旦您确定答案为“否”,或者有 20 个字节可用,这些答案可能不再准确。
  • 这是一个不同的问题:使用非阻塞(或异步)读取。

标签: c# binaryreader


【解决方案1】:

BinaryReader 本身没有DataAvailable 属性,而是the NetworkStream does

NetworkStream stream = new NetworkStream(socket);
BinaryReader reader = new BinaryReader(stream);

while (true)
{
    if (stream.DataAvailable)
    {
        // call reader.ReadBytes(...) like you normally would!
    }
    // do other stuff here!
    Thread.Sleep(100);
}

如果您在调用 reader.ReadBytes() 时没有原始 NetworkStream 的句柄,则可以使用 the BaseStream property

while (true)
{
    NetworkStream stream = reader.BaseStream as NetworkStream;
    if (stream.DataAvailable)
    {
        // call reader.ReadBytes(...) like you normally would!
    }
    // do other stuff here!
    Thread.Sleep(100);
}

【讨论】:

    【解决方案2】:

    BinaryReader 将阻塞,直到它读取所需的所有字节。唯一的例外是它是否检测到流结束。但是 NetworkStream 是一个开放的流,没有结束流的条件。因此,您可以使用使用 peek 的基本阅读器(ReadInt、ReadDouble 等)创建类,逐字节读取并且不会阻塞;或使用其他异步技术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多