BinaryReader C# - 检查是否还有字节

时间:2016-05-27 07:14:46

标签: c# binaryreader

我想知道是否有任何方法或属性允许我们查看在与BinaryReader关联的流中是否有可读字节(在我的情况下,它是一个NetworkStream,因为我正在执行TCP通信)。 我检查了documentation,我看到的唯一方法是PeekChar(),但它只检查是否有下一个字节(字符),所以万一有很多字节需要读取,增加计数器的{1}}循环可能是有效的。

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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