【问题标题】:NetworkStream missing dataNetworkStream 缺失数据
【发布时间】:2012-04-03 22:50:51
【问题描述】:

有问题的数据是一个 PNG 文件,其大小为 int。

-Sending:
ns.Write(BitConverter.GetBytes((int)data.Length),0,4);
ns.Write(data, 0, data.Length);

-Reading:
byte[] sizearray = new byte[4];
ns.Read(sizearray, 0, 4);
int dataSize = BitConverter.ToInt32(sizearray,0);

byte[] data = new byte[dataSize];
ns.Read(data, 0, dataSize);

然后将接收到的数据保存到文件中。我也用 BeginRead/EndRead 尝试过,结果相同。

问题是,虽然这适用于大多数较小的图像,但它不会收到超过几 KB 的图像。 dataSize 读取正确,但每次几千字节后(~2900),其余接收到的数据为0。Example

我是否忽略了一些事情,例如一次可以发送多少的限制?

【问题讨论】:

  • 您是否正在刷新/关闭流?

标签: c# networkstream


【解决方案1】:

您忽略了Read 的返回值。不要那样做。 Read 不会等到它读取所有您请求的数据。您应该循环阅读,直到您阅读完所需的所有内容:

byte[] data = new byte[dataSize];
int index = 0;
while (index < dataSize)
{
    int bytesRead = ns.Read(data, index, dataSize - index);
    if (bytesRead <= 0)
    {
        // Or whatever exception you want
        throw new InvalidDataException("Premature end of stream");
    }
    index += bytesRead;
}

理论上,即使在阅读 dataSize 时,您也需要这样做,尽管在实践中我怀疑您是否会在一次读取中收到少于 4 个字节。

您可能想要使用BinaryReader 包裹在流周围 - 然后您可以使用ReadInt32ReadBytes,其中ReadBytes 将为您执行循环。 (您仍然需要检查返回值,但这比自己做要简单。)

【讨论】:

  • 谢谢,我还没有意识到 Read only 分块读取,BinaryReader 也很好用。
【解决方案2】:
ns.Read(data, 0, dataSize);

这至少是您的一个问题:Read() 返回读取了多少字节,不能保证读取了dataSize 字节。

此方法将数据读入缓冲区参数并返回 成功读取的字节数。如果没有数据可用于 读取时,Read 方法返回 0。Read 操作读取一样多 可用的数据,最多为大小指定的字节数 参数。

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2014-06-21
    • 2021-01-07
    相关资源
    最近更新 更多