通过TCP发送图像

时间:2016-04-01 03:52:46

标签: c# tcp

我试图通过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();
    }

2 个答案:

答案 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()的结果,并假设它填充了缓冲区。