2

我正在尝试使用 Jon Skeet 写的EndianBinaryReaderEndianBinaryWriter作为他的misc utils lib的一部分。它非常适合我使用它的两种用途。

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 客户端的数据不断更新输入流?

4

2 回答 2

1

我不记得EndianBinaryReader缓冲区 - 你可以覆盖一个MemoryStream吗?但老实说,这里额外的对象几乎没有开销。包有多大?(将其放入 aMemoryStream将克隆byte[])。

我很想使用最简单的方法,看看是否存在真正的问题。可能我要做的一个改变引入using(因为它们是IDisposable):

using(var memoryStream = new MemoryStream(data))
using(var endianbinaryReader = ..blah..) {
    // use it
}
于 2010-01-22T16:35:36.923 回答
1

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

由于成员的数量,它可能看起来令人生畏,但它比看起来容易。有许多布尔属性,例如“CanWrite”等。覆盖它们并让它们都返回“false”,除了您的读者需要的功能(可能 CanRead 是您唯一需要为真的功能。)

然后,只需覆盖Stream 帮助中以“在派生类中被覆盖时”短语开头的所有方法,并让不受支持的方法返回“UnsupportedException”(而不是默认的“NotImplementedException”。

Implement the Read method to return data from your buffered UDP packets using perhaps a linked list of buffers, setting used buffers to "null" as you read past them so that the memory footprint doesn't grow unbounded.

于 2010-01-22T16:42:11.027 回答