我想知道是否有任何方法或属性允许我们查看在与BinaryReader
关联的流中是否有可读字节(在我的情况下,它是一个NetworkStream,因为我正在执行TCP通信)。
我检查了documentation,我看到的唯一方法是PeekChar()
,但它只检查是否有下一个字节(字符),所以万一有很多字节需要读取,增加计数器的{1}}循环可能是有效的。
关于TCP通信,问题是我没有定义TCP背后的应用程序协议,我只想弄清楚它是如何工作的!当然会有一些"长度字段"这会给我一些关于要读取的字节的线索,但是知道我只是在检查它是如何工作的,这个问题出现在我的脑海里。
答案 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的类,逐字节读取并且不阻塞;或使用其他异步技术。