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
我是否忽略了某些事情,比如限制一次可以发送多少钱?
解决方法:
你忽略了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 – 然后您可以使用ReadInt32和ReadBytes,其中ReadBytes将为您执行循环. (你仍然需要检查返回值,但这比自己做的更简单.)
标签:c,networkstream 来源: https://codeday.me/bug/20190626/1291195.html