| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1589 人关注过本帖
标题:C# 截屏 组播遇到的问题??(非常紧急)
只看楼主 加入收藏
zijianchen
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-8-13
收藏
 问题点数:0 回复次数:5 
C# 截屏 组播遇到的问题??(非常紧急)

小弟现在我参与了一个项目组,要做一个教学系统。其中有个场景是这样的:每人一台机器,老师在自己的机器上打开的任何文件以及老师在自己机器上的任何操作,学生在自己的机器上都看得到!现在实现的思路是这样:对老师的机器做截屏操作,每隔若干毫秒截屏一次,然后将此截屏所得图形文件拆成6000字节大小的若干个向全局域网组播出去,每台学生机器接受这些包,并组装成图片,并显示在学生机器上,而且当有下一幅图片的包过来时接续接受,接受完之后刷新屏幕显示。
我负责的正是实现以上场景的这个模块,采用C/S架构。
服务器端:截屏并组播。代码核心部分用一个while死循环实现。
客户端: 接受并显示,并且每当新图形来的时候刷新并显示屏幕。核心部分也用一个while死循环实现。

服务器端while循环:
while(true){

try
{

//HighResolutionTimer timer = new HighResolutionTimer();
//timer.Start();


//截屏代码

img = new Bitmap(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
g = Graphics.FromImage(img);
g.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.AllScreens[0].Bounds.Size);
//将文件转化为流 发送
m = new MemoryStream();

img.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg);
m.Flush();

Byte[] b = m.GetBuffer();


//byte[] bytes = System.Text.Encoding.Unicode.GetBytes("This is a test Message");
//uc.Send(bytes, bytes.Length, iep);

m.Seek(0, SeekOrigin.Begin);

byte[] ReadBuffer = new byte[6000];

int i = 0;
for (i = 0; i <= (b.Length - 1) / 6000 - 1; i++)
{

m.Position = i * 6000;
m.Read(ReadBuffer, 0, 6000);


// i<=文件长度/6000,因为循环从0开始的。
//每次读6000个字节。一个数据报套接字上发送的消息大于内部消息缓冲器
uc.Send(ReadBuffer, ReadBuffer.Length, iep);
//每隔18毫秒发送一个UDP包
Thread.Sleep(18);
}

m.Position = i * 6000;
//最后一块
int count;
if (b.Length % 6000 == 0)
{ count = 6000; }
else
{
count = b.Length % 6000;
}


byte[] lastpiece = new byte[count];
m.Read(lastpiece, 0, lastpiece.Length);


uc.Send(lastpiece, lastpiece.Length, iep);

byte[] endSign = System.Text.Encoding.Unicode.GetBytes("it is over!");
uc.Send(endSign, endSign.Length, iep);

}
catch (Exception ee)
{
MessageBox.Show(ee.Message + ee.StackTrace);

}

}//end of while

客户端while循环接收并显示:

string str ="empty";


while (true)
{
//if (this.ipe.receive() > 0)
//{
// MessageBox.Show("有数据收到!");

//};
ArrayList a = new ArrayList();
do
{

byte[] bytes = uc.Receive(ref iep);
if ( bytes.Length > 0)
{
str = System.Text.Encoding.Unicode.GetString(bytes, 0, bytes.Length);
if (str != "it is over!")
a.Add(bytes);
}

} while (str != "it is over!" && str !="empty");

// a.Count;
Array b = a.ToArray();
Byte[] end = (Byte[])b.GetValue(b.Length - 1);

Byte[] bitmap = new Byte[(b.Length - 1) * 6000 + end.Length];

int t = 0;

for (int i = 0; i < b.Length; i++)
{

Byte[] temp = (Byte[])b.GetValue(i);

temp.CopyTo(bitmap, t);
t = t + temp.Length;
}

System.IO.MemoryStream ms = new System.IO.MemoryStream(bitmap, 0, bitmap.Length);
//这两句要研究一下
Bitmap bm = new Bitmap(ms, true);
bm.Save("e:\\2.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
this.search.Visible = false;
this.start.Visible = false;
Image img = new Bitmap("e:\\2.jpg");
this.Size = img.Size;
this.pictureBox1.Image = bm;
//Thread.Sleep(1000);
//this.pictureBox1.Dispose();

a.Clear();
str = "empty";

//uc.Close();
}//end of while-loop


现在遇到的问题是:客户端之能显示一次,不能想预想中的刷新显示。而且有个GDI+的一般性错误出现,按照网上有个帖子解决GDI+一般性错误的终极解决方案,按照它做了,结果还是老样子。不过程序还是可以运行,但是客户端不行刷新显示,只显示第一次截屏图片。

情况紧急,请教各位大侠给小弟看看是啥原因,小弟跪谢各位的大恩大德了!!

搜索更多相关主题的帖子: 局域网 服务器 机器 架构 模块 
2007-08-13 01:44
skyland84
Rank: 2
等 级:新手上路
威 望:4
帖 子:544
专家分:0
注 册:2006-10-9
收藏
得分:0 
这个没有作过!不过也是奇怪啊!你为什么不把图保存在客户端 然后在显示阿?
不知道理解有没有对!

决定人生~
2007-08-13 08:37
师妃暄
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:805
专家分:107
注 册:2006-3-1
收藏
得分:0 
用一个timer控件,规定每秒发出组播信息

在客户端更新时只需要clear()掉,就可以继续接受

有实力才会有魅力 实力来自坚持不懈的努力
2007-08-13 10:29
zijianchen
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-8-13
收藏
得分:0 
回复:(师妃暄)用一个timer控件,规定每秒发出组播信...

呵呵,我想先让程序正常跑起来,然后再改进效率。
现在的关键问题是:
客户端显示图片的控件pictureBox,它只能显示接收到的第一幅图片。其他的图片如果改成保存在客户端硬盘上的话可以看到图片是发过来了,但是pictureBox里面显示的图片还是第一幅,也就是说这个控件没有预想的那样对显示进行不断更新。
上网查了下,有的说是pictureBox没有释放资源,它锁定了第一幅图片。后来我让pictureBox.Dispose();之后,它反而一片灰白,什么都不显示了。
昨晚一直折腾到2点,小弟以前没有学过C#和.NET
时间紧急,项目马上要验收了。。。

哭求

请大侠们多多执教。

2007-08-13 16:09
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
收藏
得分:0 
pictureBox1.Image = b;
pictureBox1.Update();
肯定可以更新的.我以前做过类似的项目.不过是用TCP传输的.

实践、学习、再实践、再学习......
2007-08-14 10:00
石教授
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-5-3
收藏
得分:0 
你好,我也要做组播的,我方便请教吗》留个qq吧,求助攻
2016-05-04 00:22
快速回复:C# 截屏 组播遇到的问题??(非常紧急)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051944 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved