我有一个基于套接字的应用程序,它在客户端使用BinaryReader
对象公开接收到的数据。我一直在尝试调试读取器中包含的数据不干净的问题...即我正在读取的缓冲区包含超过新数据大小的旧数据。
在下面的代码中:
System.Diagnostics.Debug.WriteLine("Stream length: {0}", _binaryReader.BaseStream.Length);
byte[] buffer = _binaryReader.ReadBytes((int)_binaryReader.BaseStream.Length);
当我注释掉第一行时,数据不会像我有那个打印行语句那样变脏(或者不会像往常一样变脏)。据我所知,从服务器端数据干净利落,因此我的套接字实现可能存在一些问题。但有没有人知道为什么添加该打印行会导致数据更频繁变脏?
答案 0 :(得分:1)
您的二进制阅读器看起来像是一个私有成员变量(如果前导下划线是一个告诉告诉标志)。
您的应用程序是多线程的吗?如果另一个线程试图在您读取它时也使用二进制读取器,则可能遇到竞争条件。即使没有这条线,你遇到问题的事实对我来说似乎很可疑。
答案 1 :(得分:0)
您确定您的阅读逻辑是否正确? Stream.Length
表示整个流的长度,而不是要读取的剩余数据的长度。
假设最初有100个字节可用。 Length
为100,BinaryReader
更正读取100个字节并使流位置前进100.然后,另外20个字节到达。 Length
现在是120;但是,您的BinaryReader
应该只读取20个字节,而不是120个字节。第二次读取中请求的“额外”100个字节会导致阻塞或(如果流未正确实现)中断。
答案 2 :(得分:0)
问题是愚蠢无关的。不过,我相信我的阅读逻辑是正确的。问题是我使用的_binaryReader是一个不属于我的类的引用,因此底层流被错误的数据重写。