0

我制作了这段代码来截取屏幕截图-将其转换为字节-将其发送给我的客户,但是当客户收到它时,它变成了一半。

这是代码,它将屏幕截图转换为字节,然后将其发送到我的客户端代码:

 public void SendImage()
        {
            int ScreenWidth = Screen.GetBounds(new Point(0, 0)).Width;
            int ScreenHeight = Screen.GetBounds(new Point(0, 0)).Height;
            Bitmap bmpScreenShot = new Bitmap(ScreenWidth, ScreenHeight);



            Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
            gfx.CopyFromScreen(0, 0, 0, 0, new Size(ScreenWidth, ScreenHeight));
            bmpScreenShot.Save(Application.StartupPath + "/ScreenShot.jpg", ImageFormat.Jpeg);
            byte[] image = new byte[10000*10000*10];
            bmpScreenShot = ResizeBitmap(bmpScreenShot, 300, 300);
            image = ImageToByte(bmpScreenShot);



            sck.Send(image, 0, image.Length, 0);

        }

这是接收代码

public void ReceiveImage()
    {

        if (sck.Connected)
        {

            {
                NetworkStream stream = new NetworkStream(sck);
                byte[] data = new byte[10000 * 10000 * 3];
                string receive = string.Empty;
                Int32 bytes = stream.Read(data, 0, data.Length);
                pictureBox1.Image = byteArrayToImage(data);

            }
        }
    }
4

2 回答 2

2

您正在发送 1000 * 1000 * 10 字节并且您正在接收 1000 * 1000 * 3 字节。

还要确保您从流中读取,只要有更多。

一种更安全的方法是首先发送数组的大小。

因此,在将图像转换为 JPG 后,获取字节数,以 4 个字节发送该数量,读取这 4 个字节,准备一个该大小的缓冲区并读取流。

更多提示

image = ImageToByte(bmpScreenShot);

// get the encoded image size in bytes
int numberOfBytes = image.Length;

// put the size into an array
byte[] numberOfBytesArray = BitConverter.GetBytes(numberOfBytes);

// send the image size to the server
sck.Send(numberOfBytesArray, 0, numberOfBytesArray.Length, 0);

// send the image to the server
sck.Send(image, 0, numberOfBytes, 0);

服务器

NetworkStream stream = new NetworkStream(sck);
byte[] data = new byte[4];

// read the size
stream.Read(data, 0, data.Length);
int size = BitConverter.ToInt32(data);

// prepare buffer
data = new byte[size];

// load image
stream.Read(data, 0, data.Length);
于 2012-07-30T16:12:03.590 回答
2

首先,这段代码被破坏了:

byte[] data = new byte[10000 * 10000 * 3];
Int32 bytes = stream.Read(data, 0, data.Length);

假设您将在一次调用中收到数据Read。你不能假设——它是一个协议。您应该循环直到Read返回 0... 或在数据前面加上您发送的“消息”的长度。

此外,尚不清楚做什么ResizeBitmapImageToByte做什么,但是当您真的不知道需要多少字节时必须预先分配一个数组很奇怪......

于 2012-07-30T16:13:22.327 回答