GDI+ 中发生一般性错误

l171147904 2009-09-04 04:57:04
求救啊!!!!感谢万分!!!
我是客户端发一组 二进制图片数据,通过Socket.send(byte[] a) 发送出去!服务器段 进行接收,然后转化成 图片!

服务器端 代码如下:
void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
//打开监听
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");

Socket receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endpoint = new IPEndPoint(ipAddress, 139);
receiveSocket.Bind(endpoint);
receiveSocket.Listen(10);

try
{
while (true)
{
Socket tmpSocket = receiveSocket.Accept();
byte[] buffer = new byte[tmpSocket.ReceiveBufferSize];
if (tmpSocket.Receive(buffer) > 0)
{
using (MemoryStream ms = new MemoryStream(buffer)) // buffer 已经收到数据!
{
Bitmap Origninal = new Bitmap(ms);// 这里报错。。。求救
Bitmap returnBmp = new Bitmap(Origninal.Width, Origninal.Height);
Graphics g = Graphics.FromImage(returnBmp);
g.DrawImage(Origninal, 0, 0);
ms.Close();
Image_ = (Image)returnBmp;
}
}
...全文
1077 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgq_1016 2009-09-19
  • 打赏
  • 举报
回复
我觉得是GDI 的问题,我也遇到这样的问题,我的是这样的

Graphics g;

Objecet obj=new Object();

private void DrawHis()
{
lock(obj)
{
Bitmap bmp=new Bitmap(....);
Graphics gb = Graphics.FromImage(bmp);
DrawHistroy(g);
g.DrawImage(bmp,0,0);
db.Dispose();
bmp.Dispose();
}
}

大概是这样,但是也会出现GDI+ 一般性错误。 我的DrawHis 是在线程池这中的。

System.Threading.Timer

private Start()
{
TimerCallBack timercall = new TimerCallBack(TimerFun);
Timer timer=new Timer(.......);
}
private void TimerFun(Object .. )
{
DrawHis();
}



l171147904 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 zanfeng 的回复:]
感觉用序列化比较好一些
[/Quote]



谢谢 大家的热心帮助!问题已经解决

循环等待,数据接收完全,再转化成 图片。


这里好奇,序列化 是什么意思?
liucfy 2009-09-06
  • 打赏
  • 举报
回复
兄弟用的是否是windows 2003啊??
如果是的话应该是权限设置问题。。。
网络打印没有权限。。
如果是xp就不会有这样的问题。
迈克揉索芙特 2009-09-06
  • 打赏
  • 举报
回复
这个跟GDI+没关系,是你接收的数据不全。
laoyu119 2009-09-06
  • 打赏
  • 举报
回复
判断是不是这个问题,也可以在buffer装载后,看看size和position,被引用后再看看,要确保被装入bitmap前,size和position都是正确的。
laoyu119 2009-09-06
  • 打赏
  • 举报
回复
我觉得就是因为buff指针位置不对,导致bitmap接收数据时发生了错误
laoyu119 2009-09-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 l171147904 的回复:]
求救啊!!!!感谢万分!!!
我是客户端发一组 二进制图片数据,通过Socket.send(byte[] a) 发送出去!服务器段 进行接收,然后转化成 图片!

服务器端 代码如下:
void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
//打开监听
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");

Socket receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endpoint = new IPEndPoint(ipAddress, 139);
receiveSocket.Bind(endpoint);
receiveSocket.Listen(10);

try
{
while (true)
{
Socket tmpSocket = receiveSocket.Accept();
byte[] buffer = new byte[tmpSocket.ReceiveBufferSize];
if (tmpSocket.Receive(buffer) > 0)
{
using (MemoryStream ms = new MemoryStream(buffer)) // buffer 已经收到数据!
{
这里看看ms的position是不是已经不是0了?
将ms的position置为0,再向bitmap提供


Bitmap Origninal = new Bitmap(ms);// 这里报错。。。求救
Bitmap returnBmp = new Bitmap(Origninal.Width, Origninal.Height);
Graphics g = Graphics.FromImage(returnBmp);
g.DrawImage(Origninal, 0, 0);
ms.Close();
Image_ = (Image)returnBmp;
}
}

[/Quote]
wfuyuan 2009-09-05
  • 打赏
  • 举报
回复
Up LZ...
足球中国 2009-09-05
  • 打赏
  • 举报
回复
感觉用序列化比较好一些
l171147904 2009-09-05
  • 打赏
  • 举报
回复
根据16楼的 办法 试了一下!

具体:
List<byte> listBytes = new List<byte>();//装载接收图片数据
while (true)
{
Socket tmpSocket = receiveSocket.Accept();
byte[] bytes = new byte[tmpSocket.ReceiveBufferSize];//存放每次接收到的数据 300 * 1024
int data = tmpSocket.Receive(bytes, bytes.Length, 0);
if (data <= 0)//当接收的数据为0时,表示数据接收完毕,跳出循环
break;
for (int i = 0; i < data; i++)
{
//把每次接收到的数据写入listBytes
listBytes.Add(bytes[i]);
}
}


当我发送一帧时候,客户端 发现BYTE【148992】,但是 服务端接受到的第一次数据 是 byte[8195],,,
接受完之后,执行到 Socket tmpSocket = receiveSocket.Accept(); 就不执行了!
l171147904 2009-09-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 fuqiang19871117 的回复:]
C# code
List<byte> listByte=new List<byte>();//装载接收图片数据while (true)
{
Socket tmpSocket= receiveSocket.Accept();byte[] bytes=newbyte[300*1024];//存放每次接收到的数据int data= tmpSocket.Receive(bytes,bytes.Leng¡­
[/Quote]



非常感谢,,,好像不可行!
客户端端 一直 每秒25帧的 发送数据,正常的话,服务端一直能接受到数据!

即使接受不到,也可能是 网络赌了。。。
dancingbit 2009-09-05
  • 打赏
  • 举报
回复
两个字:滑稽!
dancingbit 2009-09-05
  • 打赏
  • 举报
回复
没看到哪个Accept与Receive共用循环的。
zzmoutmans 2009-09-04
  • 打赏
  • 举报
回复
回帖是一种美德!
lsd123 2009-09-04
  • 打赏
  • 举报
回复
.
dancingbit 2009-09-04
  • 打赏
  • 举报
回复
除非你是使用byte[]构造的MemoryStream,否则,在内存流末尾的写操作都会扩展内存流。
dancingbit 2009-09-04
  • 打赏
  • 举报
回复
谁说的内存流不可扩展?
dancingbit 2009-09-04
  • 打赏
  • 举报
回复
所以要加上约束,一定时间内,不能说,我一下子没收到就结束了。可以在这儿嵌套个循环,没有数据,Sleep,完了检查一下时间,如果超过了预定的时间,结束。
前面那段代码只是示例,大概的接收代码的形式。
l171147904 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dancingbit 的回复:]
C# codeNetwrodkStream ns=new NetworkStream(tmpSocket);while(true)
{int cnt=0;if(cnt=ns.Read(buffer,0,buffer.Length)==0)break;
ms.Write(buffer,0,cnt);
}
大致如此形式。

另外,如果使用流创建Bitmap,在Bitmap生存期间,流必须保存打开,所以,不能使用using。
[/Quote]




内存流不可扩展
l171147904 2009-09-04
  • 打赏
  • 举报
回复
每秒 25帧的 速度 发送 二进制 数据!
加载更多回复(20)

110,537

社区成员

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

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

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