我试图通过tcp发送图像,它大约50%的时间工作,另外50%只是给我一个黑色图像,如果我在3秒的空间发送2它崩溃。有谁知道为什么?以及我如何解决这个问题
客户端:
while ((i = stream.Read(datalength, 0, 4)) != 0)
{
byte[] data = new byte[BitConverter.ToInt32(datalength, 0)];
stream.Read(data, 0, data.Length);
this.Invoke((MethodInvoker)delegate
{
try
{
Image Screenshot = byteArrayToImage(data);
pictureBox1.Image = Screenshot;
}
catch { }
});
}
这是将字节数组转换为图像
的函数 public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
服务器:
Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(printscreen as Image);
graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
byte[] data = imageToByteArray(Image);
stream = client.GetStream();
int length = data.Length;
byte[] datalength = new byte[4];
datalength = BitConverter.GetBytes(length);
stream.Write(datalength, 0, 4);
stream.Write(data, 0, data.Length);
这是将图像转换为字节数组的函数
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
答案 0 :(得分:1)
您必须确保阅读整个"数据包"。不确定您是否因为要求而收到所有内容。 Read()
方法将返回已读取的字节数,存储并循环,直到您收到正确的字节数。
将当前Read()
替换为:
int bytesReceived = 0;
while(bytesReceived < data.Length)
{
bytesReceived += stream.Read(data, bytesReceived, data.Length - bytesReceived);
}
这将一直显示,直到收到整个图像。
编辑:修复了代码中的问题,感谢Ivan's answer。
答案 1 :(得分:0)
当你应该阅读四个时,你正在读取1000个字节。您正在阅读并丢掉长度字后面的大部分图像。
您显然也忽略了read()
的结果,并假设它填充了缓冲区。