c# - 通过 NetworkStream 从 ZlibStream 读取在 C# .Net 中出现阻塞问题

标签 c# .net compression zlib networkstream

我有一个基于 TCP 的网络流,它是一个 Zlib 两种方式的流(客户端到服务器和服务器到客户端)。

对于Zlib,我使用的是最新的Ionic.Zlib.dll

对于发送/接收的前几个数据包,它工作正常,但是当接收到第三个左右的数据包时,它开始表现不正常。

ZlibStream 上的每个读取操作都会阻塞,直到数据包被另一端重复。

例如:

// Where reader is a BinaryReader on the ZlibStream on the NetworkStream
int a = reader.ReadInt32(); // blocks until initial packet that is 12 bytes is received
int b = reader.ReadInt32(); // blocks until the packet is repeated
int c = reader.ReadInt32(); // blocks until the packet is repeated again

在这段代码之后,数据包实际上已经发送了3次,只收到了一次。

为什么会堵在那里?我怎样才能让它不阻塞并按预期继续?

Zlib 中的刷新与它有什么关系吗? (流在每个数据包之后被刷新。)

最佳答案

Zlib 以及其他压缩算法对数据 block 进行操作。它缓冲来自源流的一些数据,然后尝试压缩它。

如果您放入小于缓冲区大小的 ZlibStream 数据,实际上 ZlibStream 不会立即产生任何数据。您的数据将一直坐在那里,直到缓冲区填满。要压缩数据,刷新原始流,甚至可能压缩流,是不够的。

如果服务关闭 ZlibStream,您所有的 readInts 都应该接收到正确的数据。

如果要实时接收来自服务器的数据包,请尝试先完全压缩数据包,然后通过网络流发送。

关于c# - 通过 NetworkStream 从 ZlibStream 读取在 C# .Net 中出现阻塞问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18049353/

相关文章:

c# - 在线程之间共享局部变量是否安全(通过回调闭包)?

java - 压缩字符串并将其作为字符串存储在数据库中以供以后解压

java - 如何压缩整数序列?

compression - 如何使用 brotli 命令行(版本 0.5.2)压缩文件夹?

c# - 为什么绑定(bind)到按钮的命令与绑定(bind)到菜单项的命令具有不同的行为?

c# - .NET 中如何实现 "Event"对象?

c# - 什么时候在 Linq 中调用 OnValidate?

c# - 如何在毛伊岛添加应用程序跟踪透明度

c# - WPF 未出现在 WinForms 的 ElementHost 内

c# - 我如何区分 C# 中的两个相同对象?