【问题标题】:Network stream reading before all data has been written在所有数据写入之前读取网络流
【发布时间】:2014-04-04 16:47:52
【问题描述】:

我的服务器将使用 networkStream.Write(messageBytes); 发送消息

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

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

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

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

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

还有没有等待收到所有信息?

谢谢。

【问题讨论】:

    标签: c# stream


    【解决方案1】:

    这真的没有意义。套接字读取函数告诉您有多少数据可用/已读入缓冲区,因此,如果您正在处理缓冲区中的一堆 NUL,因为尚未收到其余数据,那是您不检查如何收到了很多数据。如果您期待更多数据,请继续接收,直到获得预期的数据(通过将指针推进到接收缓冲区或复制到新缓冲区等来避免覆盖先前接收的块)。

    【讨论】:

    • 啊,好吧,与其读取头信息,不如获取有效负载长度,然后进行读取(此时并非所有内容都已进入)。有一些逻辑可以检查有效负载长度是否大于已读入的长度,然后等待?
    • 对。你会有一个循环,比如while (bytesReceived < payloadLength) { bytesReceived += socket.read(buffer); ... }
    • 非常感谢,我遇到这个问题好几天了,才意识到是什么原因造成的。
    【解决方案2】:

    系统网络缓冲区不是无限的,如果你不将它们从 Windows 套接字读取到你的内存,它们将停止接收。

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

    byte[] data = new byte[dataLength];
    

    并不断将数据推送到数组中,直到全部读取完毕。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多