2010-01-22 74 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數據包返回數據,當您讀取它們時將已使用的緩衝區設置爲「空」,以便內存佔用不會無限增長。