我有一个基于 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/