C# 截图未完全传输

C# 截图未完全传输,c#,image,file,C#,Image,File,我的程序现在正在从一台计算机向另一台计算机发送屏幕截图,但接收端img的结果如下所示: Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight); Graphics gfx = Graphics.FromImage((Image)bmpScreenShot); gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth

我的程序现在正在从一台计算机向另一台计算机发送屏幕截图,但接收端img的结果如下所示:

Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight);
                  Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
                  gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));
                  bmpScreenShot.Save("pic.jpg", ImageFormat.Jpeg);
                  MemoryStream ms = new MemoryStream();
                  bmpScreenShot.Save(ms, ImageFormat.Jpeg);
                  bmpbyte = ms.ToArray();

                  bmpScreenShot.Dispose();
                  ms.Close();
                  ///////////////////////////
                  Send_Text("" + screenHeight);
                  textBox3.Text += ("\r\nSending Hight=" + screenHeight);
                  Send_Text("" + screenWidth);
                  textBox3.Text += ("\r\nSending Width=" + screenWidth);
                  System.Threading.Thread.Sleep(200);
                  Send_Text("" + bmpbyte.Length);
                  textBox3.Text += ("\r\nSending size of:" + bmpbyte.Length);

                  textBox3.Text += "\r\nTransmiting the Screenshot";
                  stm.Write(bmpbyte, 0, bmpbyte.Length);
                  textBox3.Text += "\r\nSent IMG :)";

上面的代码是它的客户端 im发送pic的大小(高、宽和数组长度),并正确传输 但是我说的服务器已经让trobles得到了完整的图片

textBox2.Text += "\r\n Getting h";
            byte[] buffer = new byte[320];
            s.Receive(buffer);
            string str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
            Array.Clear(buffer, 0, buffer.Length);
            int h = int.Parse(str);
            textBox2.Text += "="+h+"\r\n Getting w";
            s.Receive(buffer);
             str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
             Array.Clear(buffer, 0, buffer.Length);
             int w = int.Parse(str);
            textBox2.Text += "="+w+"\r\n Getting p";
            s.Receive(buffer);
            str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
            Array.Clear(buffer, 0, buffer.Length);
            int p = int.Parse(str);
            textBox2.Text += "=" + p;
            byte[] asd = new byte[p];
            Bitmap cc = new Bitmap(h, w);


            s.Receive(asd);

            MemoryStream ms = new MemoryStream(asd);

            Image bmp = Image.FromStream(ms);
            bmp.Save("End.jpg", ImageFormat.Jpeg);
            pictureBox1.Image = bmp;
请注意,所有未定义的东西都是在代码中的某个地方定义的 文本框行仅用于用户界面 还有一件事,我正在使用localhost\local network和it all tcp,您没有告诉我们如何发送信息(通过网络?串行?tcp?),但从您的代码中我可以看到一件事:

您确实收到了要等待的实际字节数,但您没有等待实际的字节数

byte[] asd = new byte[p];
s.Receive(asd);
这确实会创建一个足够大的字节数组来保存所有字节,但是
s.Receive(asd)
真的会接收所有字节吗


在您编辑完您的问题之后,让我澄清一件事:TCP通信可能会被分割。仅仅因为一次发送4000字节,并不保证接收器一次接收4000字节。他可能不会。这就是为什么
Receive
方法返回实际接收的字节数

因此,接收器需要做的是(伪代码):

inttotalbytesread=0;
做
{
int bytesRead=s.Receive(缓冲区);
totalBytesRead+=字节读取;
如果(字节读==0)
{
//流已关闭-没有更多字节
打破
}
其他的
{
//写入字节从缓冲区读取字节到内存流
}
}
while(totalBytesRead

实际上,再仔细想想,看看你的代码,我注意到你实际上是在向接收器发送JPEG字节。接收器端未初始化的缓冲区不太可能是有效的JPEG

因此,尽管上述所有情况仍然属实,但我现在怀疑接收者是否真的做错了事情。现在看来,将字节保存到内存流无法正常工作

我从代码中看到,您正在将图像保存到文件和内存流中。文件是否包含有效的图片?如果没有,您需要查找屏幕截图未正确创建的原因。如果图片有效,您可以尝试其他两种方法:

  • 从文件中读取JPEG字节,而不是创建内存流
  • 在将字节发送到客户端之前,不要处理内存流,而是在发送到客户端之后
  • 上存在一些问题,表明在将图像保存到内存流并从该流获取字节时,计时似乎是一个问题。有时它不起作用。

    您没有告诉我们如何发送信息(通过网络?串行?TCP?),但从您的代码中我可以看到一件事:

    您确实收到了要等待的实际字节数,但您没有等待实际的字节数

    byte[] asd = new byte[p];
    s.Receive(asd);
    
    这确实会创建一个足够大的字节数组来保存所有字节,但是
    s.Receive(asd)
    真的会接收所有字节吗


    在您编辑完您的问题之后,让我澄清一件事:TCP通信可能会被分割。仅仅因为一次发送4000字节,并不保证接收器一次接收4000字节。他可能不会。这就是为什么
    Receive
    方法返回实际接收的字节数

    因此,接收器需要做的是(伪代码):

    inttotalbytesread=0;
    做
    {
    int bytesRead=s.Receive(缓冲区);
    totalBytesRead+=字节读取;
    如果(字节读==0)
    {
    //流已关闭-没有更多字节
    打破
    }
    其他的
    {
    //写入字节从缓冲区读取字节到内存流
    }
    }
    while(totalBytesRead

    实际上,再仔细想想,看看你的代码,我注意到你实际上是在向接收器发送JPEG字节。接收器端未初始化的缓冲区不太可能是有效的JPEG

    因此,尽管上述所有情况仍然属实,但我现在怀疑接收者是否真的做错了事情。现在看来,将字节保存到内存流无法正常工作

    我从代码中看到,您正在将图像保存到文件和内存流中。文件是否包含有效的图片?如果没有,您需要查找屏幕截图未正确创建的原因。如果图片有效,您可以尝试其他两种方法:

  • 从文件中读取JPEG字节,而不是创建内存流
  • 在将字节发送到客户端之前,不要处理内存流,而是在发送到客户端之后
  • 上存在一些问题,表明在将图像保存到内存流并从该流获取字节时,计时似乎是一个问题。有时它不起作用。

    您没有告诉我们如何发送信息(通过网络?串行?TCP?),但从您的代码中我可以看到一件事:

    您确实收到了要等待的实际字节数,但您没有等待实际的字节数

    byte[] asd = new byte[p];
    s.Receive(asd);
    
    这确实会创建一个足够大的字节数组来保存所有字节,但是
    s.Receive(asd)
    真的会接收所有字节吗


    在您编辑完您的问题之后,让我澄清一件事:TCP通信可能会被分割。仅仅因为一次发送4000字节,并不保证接收器一次接收4000字节。他可能不会。这就是为什么
    Receive
    方法返回实际接收的字节数

    因此,接收器需要做的是(伪代码):

    inttotalbytesread=0;
    做
    {
    int b