gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:33:00 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com