首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetworkStream缺少数据

NetworkStream缺少数据
EN

Stack Overflow用户
提问于 2012-04-03 22:47:27
回答 2查看 1.3K关注 0票数 4

有问题的数据是一个PNG文件,以它的大小作为int的前缀。

代码语言:javascript
复制
-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

我是不是忽略了什么,比如一次可以发送多少钱的限制?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-03 22:50:37

您忽略了Read的返回值。别干那事。Read在读取您请求的所有数据之前不会等待。你应该循环阅读,直到你读完了你需要的所有东西:

代码语言:javascript
复制
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将为您执行循环。(您仍然需要检查返回值,但这比自己检查要简单得多。)

票数 3
EN

Stack Overflow用户

发布于 2012-04-03 22:50:51

代码语言:javascript
复制
ns.Read(data, 0, dataSize);

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

此方法将数据读入缓冲区参数,并返回成功读取的字节数。如果没有数据可供读取,则Read方法返回0。读取操作读取尽可能多的可用数据,最多为size参数指定的字节数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9995714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档