我有一个通过 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 以及其他压缩算法对数据块进行操作。它从源流中缓冲一些数据,然后尝试对其进行压缩。
如果您放入小于缓冲区大小的 ZlibStream 数据,则实际上不会立即从 ZlibStream 中输出任何内容。您的数据将一直放在那里,直到缓冲区填满为止。要压缩该数据,刷新原始流,甚至可能是压缩流是不够的。
如果服务关闭 ZlibStream,您的所有 readInts 都应该收到正确的数据。
如果您想实时接收来自服务器的数据包,请尝试先将数据包完全压缩,然后通过网络流发送。
关于c# - 通过 NetworkStream 从 ZlibStream 读取 C# .Net 中的阻塞问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18049353/