在写入所有数据之前读取网络流

时间:2014-04-04 16:47:52

标签: c# stream

我的服务器将使用networkStream.Write(messageBytes);

发送消息

我的客户端将使用networkStream.Read()接收消息。客户端将逐字节读取序列,当它找到序列时,它会读取头部的其余部分。

标头包含有效负载长度。有了这个,我使用有效负载长度读取流来获取有效负载。

我的问题是当我写数据时,我的客户会立即尝试阅读,此时可能还没有写出所有数据。

所以我最终得到了一条有效切断结束的消息:

" blablablablabl \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0"

无论如何都要等待收到所有信息?

感谢。

2 个答案:

答案 0 :(得分:2)

这并没有多大意义。套接字读取函数告诉您有多少数据可用/已被读入缓冲区,因此如果您在缓冲区中处理一堆NUL,因为其余数据尚未被接收,那么&#39 ;你没有检查收到了多少数据。如果你期待更多的数据,请继续接收,直到你得到你想要的数量为止(避免通过将指针推进接收缓冲区或复制到新的缓冲区等来覆盖先前接收到的块)。

答案 1 :(得分:1)

系统网络缓冲区不是无限的,如果你不把它们从windows socket读到你的内存,它们就会停止接收。

在这种情况下,您可能想为数据创建一个内存存储:

byte[] data = new byte[dataLength];

继续将数据推入数组,直到全部读完为止。