2010-01-22 70 views
2

我正在尝试使用Jon Skeet作为其misc utils lib的一部分编写的EndianBinaryReaderEndianBinaryWriter。它适用于我所做的两个用途。EndianBinaryReader - 输入流的连续更新?

从网络流(TCPClient)的第一次读取中,我坐在一个读取数据的循环中。我可以创建一个EndianBinaryReader,然后在关闭应用程序时处理它。我构建EndianBinaryReader通过传递TCPClient.GetStream英寸

我现在试图从UdpClient读取时做同样的事情,但它没有流,因为它是连接少。所以我得到像这样

byte[] data = udpClientSnapShot.Receive(ref endpoint); 

我可以把这个数据到内存流

var memoryStream = new MemoryStream(data); 

,然后将数据创建EndianBinaryReader

var endianbinaryReader = new EndianBinaryReader(
    new BigEndianBitConverter(), memoryStream,Encoding.ASCII); 

但这意味着我要创建一个每次我读一个新的最后读者。有没有一种方法可以创建一个单一的流,我可以使用udp客户端的数据更新输入流?

回答

1

我不记得是否EndianBinaryReader缓冲区 - 你可以覆盖一个MemoryStream?但说实话,这里的额外对象的开销很小。数据包有多大? (将其放入MemoryStream将克隆byte[])。

我会试图使用最简单的工作,看看是否有真正的问题。也许一个改变我化妆是引进using(因为它们是IDisposable):

using(var memoryStream = new MemoryStream(data)) 
using(var endianbinaryReader = ..blah..) { 
    // use it 
} 
1

你最好的选择可能是.NET流类覆盖,以提供您的自定义功能。该类被设计为可以覆盖自定义行为。

由于成员数量的不同,它可能看起来令人望而生畏,但它比看起来容易。有许多布尔属性,例如“CanWrite”等。覆盖它们并使它们全部返回“假”,除了读者需要的功能(可能CanRead是唯一一个你需要的是真的。)

然后,覆盖所有以the help for Stream中的短语“当在派生类中重写时”开头并且不支持的方法返回“UnsupportedException”(而不是缺省的“NotImplementedException”)的所有方法(

)实现Read方法使用可能的缓冲区链接列表从缓冲的UDP数据包返回数据,当您读取它们时将已使用的缓冲区设置为“空”,以便内存占用不会无限增长。