c# -流.Read读空字节

本文关键字:字节 Read | 更新日期: 2023-09-27 18:05:13

从浏览器接收多部分数据(其大小大于~2KB),我开始接收空''0'字节后的前几个块是相关的,当我使用:

_Stream.Read(ByteArray, Offset, ContentLength);

但是,如果我将ContentLength分成小缓冲区(每个大约2KB) 在每次调用Read()后添加1ms的延迟,那么它工作得很好:

for(int i = 0; i < x; i++)
{
    _Stream.Read(ByteArray, Offset * i, BufferSize);
    System.Threading.Thread.Sleep(1);
}

但是,添加延迟是相当慢的。如何防止读取空字节。我怎么知道浏览器写了多少字节呢?

谢谢

c# -流.Read读空字节

实际上没有收到0x00字节,它们从未被写入。

Stream.Read()返回实际读取的字节数,在您的情况下通常小于BufferSize。少量数据通常以单个消息的形式到达,在这种情况下不会发生问题。

延迟可能在您的测试场景中"工作",因为到那时网络层已经缓冲了比BufferSize数据更多的数据。它可能会在生产环境中失败。

所以你需要把你的代码改成这样:
int remaining = ContentLength;
int offset = 0;  
while (remaining > 0)
{
    int bytes = _Stream.Read(ByteArray, offset, remaining);
    if (bytes == 0)
    {
        throw new ApplicationException("Server disconnected before the expected amount of data was received");
    }
    offset += bytes;
    remaining -= bytes;
}