我的应用程序从 TCP 套接字读取字节并需要缓冲它们,以便我以后可以从中提取消息。由于 TCP 的性质,我可能会在一次读取中获得部分或多条消息,因此每次读取后我想检查缓冲区并提取尽可能多的完整消息。
因此我想要一个允许我执行以下操作的类:
- 向其附加任意字节[]数据
- 在不使用内容的情况下检查内容,特别是检查内容的数量并搜索某个字节或多个字节是否存在
- 提取并使用部分数据作为 byte[],同时将其余数据留在那里以供将来读取
我希望我想要的可以用 .NET 库中的 1 个或多个现有类来完成,但我不确定是哪些。 System.IO.MemoryStream 看起来接近我想要的,但是 (a) 不清楚它是否适合用作缓冲区(读取数据是否从容量中删除?)和(b) 读取和写入似乎发生在同一个地方 - “流的当前位置是下一个读取或写入操作可能发生的位置。” - 这不是我想要的想。我需要写到最后,从前面开始阅读。
最佳答案
我建议您在后台使用 MemoryStream
,但将其封装在另一个类中,该类存储:
MemoryStream
- 当前“已读”位置
- 当前“消耗”的位置
然后它将暴露:
- 写入:设置流的位置到末尾,写入数据,将流的位置设置回读取的位置
- Read:读取数据,设置读取位置为流的位置
- 消费:更新消费位置(详细信息基于您尝试消费的方式);如果消费位置高于某个阈值,则将现有缓冲数据复制到新的
MemoryStream
并更新所有变量。 (您可能不想在每个 消费请求时复制缓冲区。)
请注意,如果没有额外的同步,这些都不是线程安全的。
关于c# - 在 C# 中缓冲字节数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7122972/