NetworkStream缺少数据

时间:2012-04-03 14:47:27

标签: c# networkstream

有问题的数据是一个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

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

2 个答案:

答案 0 :(得分:3)

您忽略了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将为您执行循环。 (你仍然需要检查返回值,但这比自己做的更简单。)

答案 1 :(得分:1)

ns.Read(data, 0, dataSize);

这里至少有一个问题:Read()返回读取的字节数,不能保证读取dataSize个字节。

  

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