socket传输图片接收时,出现GDI+ 中发生一般性错误

anya 2008-11-26 12:29:32
如题.(Winform程序)接收图片的代码如下:
private void button1_Click(object sender, EventArgs e)
{

//设置接收数据缓冲区的大小
byte[] b = new byte[2000001];
System.Net.Sockets.Socket hostsocket = receivesocket.Accept();
//如何确定该数组大小
System.IO.MemoryStream fs = new System.IO.MemoryStream();
//接收数据
hostsocket.Receive(b);
fs.Write(b, 0, b.Length);
Bitmap Img = new Bitmap(fs);
pictureBox1.Image = Img;
//关闭写文件流
fs.Close();
//关闭接收数据的Socket
hostsocket.Shutdown(System.Net.Sockets.SocketShutdown.Receive);
hostsocket.Close();
}

总是在执行到" Bitmap Img = new Bitmap(fs);"这句的时候,出现错误提示--------GDI+ 中发生一般性错误.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
谢谢.

...全文
211 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
anya 2008-11-27
  • 打赏
  • 举报
回复
同志们,好了,好了,问题解决了,代码改成这样了

int got = 0;
int datalength = 0;

while(true)
{
got = hostsocket.Receive(b);
fs.Write(b, 0, got);
if(got>0)
datalength = datalength + got;
else
break;
}


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

今天是感恩节,给我带来了好运,感恩的心,阿门!呵呵.


感谢IE,感谢微软,感谢socket,感谢.net,感谢楼上的各位,(特别关注奖颁发给:jzywh---江大鱼同志,thank you),并祝大家好运.
anya 2008-11-27
  • 打赏
  • 举报
回复
改成
while (got >= 0)
{
got = hostsocket.Receive(b);
fs.Write(b, 0, got);
datalength = datalength + got;
}


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

就循环执行了,但是循环了N次之后,出现下列提示
~~~~~~~~~~~~~~~~~~~

由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作
anya 2008-11-27
  • 打赏
  • 举报
回复
while (got > 0)
{
got = hostsocket.Receive(b);
fs.Write(b, 0, got);
datalength = datalength + got;
}


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我用断点跟踪,这段代码好象没执行,系统直接跳过了
mayibushangshu 2008-11-27
  • 打赏
  • 举报
回复
保存图片文件夹只读属性改掉!
anya 2008-11-27
  • 打赏
  • 举报
回复
谢谢楼上.并祝各位感恩节快乐.


楼上,按照你那样我改了循环代码,但是执行到 -------Bitmap Img = new Bitmap(fs);-------时,提示"参数无效"

private void button1_Click(object sender, EventArgs e)
{
this.label2.Text = "图象正在传输中,请稍侯";
//设置接收数据缓冲区的大小
byte[] b = new byte[600000000];
System.Net.Sockets.Socket hostsocket = receivesocket.Accept();
//如何确定该数组大小
System.IO.MemoryStream fs = new System.IO.MemoryStream();


int got = 0;
int datalength = 0;


while (got > 0)
{
got = hostsocket.Receive(b);
fs.Write(b, 0, got);
datalength = datalength + got;
}
Bitmap Img = new Bitmap(fs);
pictureBox1.Image = Img;
Img.Save("e:\\MyJpeg.jpg", ImageFormat.Jpeg);
// this.Image1.ImageUrl = @"e:\MyJpeg.jpg";
//关闭写文件流
fs.Close();
//关闭接收数据的Socket
hostsocket.Shutdown(System.Net.Sockets.SocketShutdown.Receive);
hostsocket.Close();
this.label2.Text = "图象传输完毕";


}
anya 2008-11-26
  • 打赏
  • 举报
回复
可是我在发送端截取的是完整的图象.但接收完了在picturebox上显示的是黑屏.这是为什么呢
cpio 2008-11-26
  • 打赏
  • 举报
回复
因为接收没有接收完,一直要接收完了才可以
jzywh 2008-11-26
  • 打赏
  • 举报
回复
汗?


你这样循环当然OutOfMemory阿。。。。


int got = 0;
int datalength = 0;


while(got > 0)
{
got = hostsocket.Receive(b);
fs.Write(b, 0, got);
datalength = datalength + got;
}
anya 2008-11-26
  • 打赏
  • 举报
回复
我把while循环加入后,又出现下列提示:
引发类型为"System.OutOfMemoryException"的异常


代码如下:
private void button1_Click(object sender, EventArgs e)
{
this.label2.Text = "图象正在传输中,请稍侯";
//设置接收数据缓冲区的大小
byte[] b = new byte[600000000];
System.Net.Sockets.Socket hostsocket = receivesocket.Accept();
//如何确定该数组大小
System.IO.MemoryStream fs = new System.IO.MemoryStream();


int got = 0;
int datalength = 0;
do
{
got =hostsocket.Receive(b);
fs.Write(b, 0, b.Length);
datalength = datalength + got;
}
while ((got == 600000000));
Bitmap Img = new Bitmap(fs);
pictureBox1.Image = Img;
Img.Save("e:\\MyJpeg.jpg", ImageFormat.Jpeg);
// this.Image1.ImageUrl = @"e:\MyJpeg.jpg";
//关闭写文件流
fs.Close();
//关闭接收数据的Socket
hostsocket.Shutdown(System.Net.Sockets.SocketShutdown.Receive);
hostsocket.Close();
this.label2.Text = "图象传输完毕";
}
anya 2008-11-26
  • 打赏
  • 举报
回复
谢谢楼上,我把buffer大小改成byte[] b = new byte[600000000]还是不行.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
楼上,加一个while,怎么加啊,我不会(脸红ing)
anya 2008-11-26
  • 打赏
  • 举报
回复
1. 你确定你的图片接受完了么?
你的buffer大小是2000001,如果图片大于这么多,你的图片肯定收不完。
你应该在杰和艘图片的时候加一个while

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
谢谢楼上,怎么加,我不会(脸红ing)
jzywh 2008-11-26
  • 打赏
  • 举报
回复
1. 你确定你的图片接受完了么?
你的buffer大小是2000001,如果图片大于这么多,你的图片肯定收不完。
你应该在杰和艘图片的时候加一个while

2. 接受完图片之后,加载图片之前,最好把fs Seek到Stream最开头
anya 2008-11-26
  • 打赏
  • 举报
回复
是不是我在客户端只是截屏显示了,但是根本就没有传递到接收端???

发送端截屏和传输代码如下:
private void button1_Click(object sender, EventArgs e)
{
//***************************************************************************************截屏*********************************************************//
this.Hide();
IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null);
//创建显示器的DC
Graphics g1 = Graphics.FromHdc(dc1);
//由一个指定设备的句柄创建一个新的Graphics对象
Bitmap MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1);
//根据屏幕大小创建一个与之相同大小的Bitmap对象
Graphics g2 = Graphics.FromImage(MyImage);
//获得屏幕的句柄
IntPtr dc3 = g1.GetHdc();
//获得位图的句柄
IntPtr dc2 = g2.GetHdc();
//把当前屏幕捕获到位图对象中
BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376);
//把当前屏幕拷贝到位图中
g1.ReleaseHdc(dc3);
//释放屏幕句柄
g2.ReleaseHdc(dc2);
//释放位图句柄
MyImage.Save("d:\\新建文件夹\\MyJpeg.jpg", ImageFormat.Jpeg); //当然你也可以根据自己的需要,把屏幕以其他图片的格式来保存,如果你想把图片保存为位图文件,可以把"ImageFormat.Jpeg"改换成"ImageFormat.Bmp";想把图片保存为Gif文件,就把"ImageFormat.Jpeg"改换成"ImageFormat.Gif"。你可以保存的文件类型大概有十多种,这里就不一一介绍了,当然你也要相应改变保存文件的后缀。
pictureBox1.Image = MyImage;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; //本程序所用控件为1个按狃,一个panel,一个picturebox,其中panel的属性Autoscroll =true; picturebox的属性SizeMode =AutoSize; 然后只要改变pictureBox的大小,图象就会跟着改变大小,如果把这句去掉的话,就可以实现图象按panel滚动条移动而查看全图。

// MessageBox.Show("已经把当前屏幕保存到D:\\MyJpeg.jpg文件中!");
this.Show();


//***************************************************************************************开始使用socket发送文件*********************************************************//

//建立终结点
System.IO.MemoryStream Stream = new System.IO.MemoryStream();
pictureBox1.Image.Save(Stream, System.Drawing.Imaging.ImageFormat.Bmp);//存储为bmp图象
// pictureBox1.Image.Save(Stream, System.Drawing.Imaging.ImageFormat.Jpeg); //不想存储为bmp图象,想存储为jpeg图象
byte[] b = Stream.ToArray();
//连接远程计算机
sendsocket.Send(b);
//发送

Stream.Close();
sendsocket.Shutdown(System.Net.Sockets.SocketShutdown.Send);
//关闭发送连接
sendsocket.Close(); //关闭本

//***********************************************************************************************************end*******************************************************//


}

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧