C# 截图未完全传输
我的程序现在正在从一台计算机向另一台计算机发送屏幕截图,但接收端img的结果如下所示: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
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 因此,尽管上述所有情况仍然属实,但我现在怀疑接收者是否真的做错了事情。现在看来,将字节保存到内存流无法正常工作 我从代码中看到,您正在将图像保存到文件和内存流中。文件是否包含有效的图片?如果没有,您需要查找屏幕截图未正确创建的原因。如果图片有效,您可以尝试其他两种方法:
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 因此,尽管上述所有情况仍然属实,但我现在怀疑接收者是否真的做错了事情。现在看来,将字节保存到内存流无法正常工作 我从代码中看到,您正在将图像保存到文件和内存流中。文件是否包含有效的图片?如果没有,您需要查找屏幕截图未正确创建的原因。如果图片有效,您可以尝试其他两种方法:
byte[] asd = new byte[p];
s.Receive(asd);
这确实会创建一个足够大的字节数组来保存所有字节,但是s.Receive(asd)
真的会接收所有字节吗
在您编辑完您的问题之后,让我澄清一件事:TCP通信可能会被分割。仅仅因为一次发送4000字节,并不保证接收器一次接收4000字节。他可能不会。这就是为什么
Receive
方法返回实际接收的字节数
因此,接收器需要做的是(伪代码):
inttotalbytesread=0;
做
{
int b