c#tcp传图片,从服务器下载图片显示,有时会出现错误,我将下载图片文件打开和源文件对比发现文件有问题(文件大小是一样的),求解
服务器
for (int i = 0; i < albumlist.Count; i++)
{
FileStream fs = new FileStream(albumlist[i].A_photo, FileMode.Open, System.IO.FileAccess.Read, FileShare.ReadWrite);
byte[] image = new byte[(int)fs.Length];
int length = (int)fs.Length;
int send = 0;
while (length > 0)
{
send = fs.Read(image,send , length );
length = length - send ;
}
buffer = BitConverter.GetBytes((int)fs.Length);
streamToClient.Write(buffer, 0, buffer.Length);
streamToClient.Write(image, 0, image.Count());
}
客户端
for (int i = 1; i <= num; i++)
{
string fileName = "E:\\mp3\\recalbm" + i + ".png";
FileStream fs = new FileStream(fileName, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
recv = networkstream.Read(buffer, 0, 4);
int t = BitConverter.ToInt32(buffer, 0);
byte[] image = new byte[t];
recv = 0;
while (t > 0)
{
recv = networkstream.Read(image, recv, t);
// Thread.Sleep(100);
t = t - recv;
}
bw.Write(image);
image = null;
bw.Close();
fs.Close();}
------解决思路----------------------
你比较一下,是不是文件末尾不同,这种情况一般都是到文件末尾时容易出错
------解决思路----------------------
while (length > 0)
{
send = fs.Read(image,send , length );
length = length - send ;
}
这种代码, image 内容一遍遍被覆盖,有什么意义啊?
如果你要把 fs 内容“一次性地”写出去,你应该首先缓存起来,例如使用 MemoryStream,(按照你的格式)先入数据长度再写入文件内容,然后使用 MemoryStream.ToArray() 方法获得要写出去的 image 内容。