我的程序现在是从一个copmuter发送一个屏幕截图到另一个,但img看起来像在reciving方面的结果:
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 :)";
顶部的代码是客户端 我发送图片的大小(高度和宽度和数组长度),它正确传输 但正如我所说的服务器有令人失望的完整图片
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网络而且都是tcp
答案 0 :(得分:3)
您没有告诉我们如何您发送信息(通过网络?串行?TCP?),但是从您的代码我可以看到一件事:
您确实收到了要等待的实际字节数,但您不是在等待实际的字节数。
byte[] asd = new byte[p];
s.Receive(asd);
这个 创建一个足够大的字节数组来保存所有字节,但s.Receive(asd)
真的接收到所有字节吗?
在您编辑了问题后,让我澄清一件事:TCP通信可能会碎片化。仅仅因为你一次发送4000个字节并不能保证接收器一次接收4000个字节。他可能不会。这就是Receive
方法返回实际接收的字节数的原因。
那么接收者需要做的就是这个(伪代码):
int totalBytesRead = 0;
do
{
int bytesRead = s.Receive(buffer);
totalBytesRead += bytesRead;
if (bytesRead == 0)
{
// Stream was closed - no more bytes
break;
}
else
{
// Write bytesRead bytes from buffer to memory stream
}
}
while (totalBytesRead < expectedNumberOfBytes);
if (totalBytesRead < expectedNumberOfBytes)
throw new Exception("Premature end of transmission");
实际上,再次思考并查看代码时,我注意到您实际上正在向接收方发送 JPEG 字节。接收方的未初始化缓冲区应该是有效的JPEG,这是非常不可能的。
所以虽然以上所有内容仍然属实,但我现在怀疑接收器实际上是一个做错的人。现在看来,将字节保存到内存流中无法正常工作。
我从您的代码中看到,您将图像保存到文件和内存流中。 文件是否包含有效图片?如果不是,您需要查找未正确创建屏幕截图的原因。如果图片有效,您可以尝试另外两件事:
有关SO的问题表明,在将图像保存到内存流并从流中获取字节时,时序似乎是一个问题。有时它不起作用。