IM通讯会议系统

上传人:沈*** 文档编号:79446371 上传时间:2022-04-23 格式:DOC 页数:54 大小:477.50KB
收藏 版权申诉 举报 下载
IM通讯会议系统_第1页
第1页 / 共54页
IM通讯会议系统_第2页
第2页 / 共54页
IM通讯会议系统_第3页
第3页 / 共54页
资源描述:

《IM通讯会议系统》由会员分享,可在线阅读,更多相关《IM通讯会议系统(54页珍藏版)》请在装配图网上搜索。

1、高级编程程序设计IM通讯会议系统院 系: 计算机科学技术学院软件工程系 班 级: 软件 08 1班 姓 名: XXX 学 号: 5 号 合 作 者: XX XXX XXX XXX 指导教师: XXX 2010年7月 24日面向对象程序设计任务书一、题目:视频会议系统二、设计要求(1组成课程设计小组。(2)小组成员分工协作完成。要求每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。(3)查阅相关资料,自学具体课题中涉及到的新知识。(4)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。(5)所设计的系统应有对数据库操作。(6)按要求写出课程设计报告,并于设计结束后1周内提交。其

2、主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求分析、总体设计、详细设计、程序的调试与测试、总结与体会、结束语、程序清单(带中文注释)、参考文献等。三、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行左右,不得抄袭。四、课程设计工作计划2010年6月30日前,指导教师讲课,学生根据题目准备资料,需求分析;2010年6月30日,设计小组进行总体方案设计和任务分工;2010年7月1日,提交软件总体模块结构图和分工方案;2010年7月1日2010年7月6日,每人完成自己承担的程序模块并通过独立编译;2010年7月21日2010年7月2

3、2日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行,数据必须存储到磁盘文件中,已备验收;2010年7月23日,验收、开始撰写课程设计报告;2010年7月25日前,提交课程设计报告,并将软件的源文件及报告的word文档打印交到老师办公室里。 指导教师签章: 教研室主任签章 高级编程课程设计指导教师评语与成绩指导教师评语:课程设计表现成绩: 课程设计验收成绩: 课程设计报告成绩: 课程设计 总成绩: 指导教师签章 20010年 7月 日 目 录1 概述11.1研究的背景及意义11.2设计的任务和需要的知识点11.3具体完成的设计内容22 需求分析32.1信息需求32.2功能需求33

4、详细设计43.1操作流程43.2部分详细设计104 调试分析、测试结果165 总结186 结束语207程序清单22参考文献50I 1 概述1.1研究的背景及意义C#高级编程课程设计是软件工程专业实践性重要环节之一,是学习完C#高级编程课程后进行的一次较全面的综合练习。其目的在于加深对编程的理论、方法和基础知识的理解,掌握编程实现机理和各种典型算法,系统地了解编程的设计和实现思路,培养学生的系统设计能力,并了解编程的发展动向和趋势。根据老师的要求:1、 以小组为单位,延续上学期面向对象程序设计课设分组形式,由李秀鹏任项目经理,臧艳协助工作。2、 以最后一次综合实验QQ程序为基础,进行扩展。要求班

5、长课代表带领同学上网查阅相关资料,了解目前已有网上会议系统基本情况,结合自己所学加以实现。3、 课设中要充分应用到本学期课程所学知识,必须包含Internet编程、多线程编程、数据库技术、Win Form程序开发等相关知识。4、 可结合已有技术、自查资料等对该系统进行扩展开发,如加入视频、语音功能等。通过自己所学到的课本知识,充分运用Socket,多线程,信道注册,网络编程,数据库的操作等知识实现本组的IM会议系统。1.2设计的任务和需要的知识点一、设计的任务分工:A:负责完成大部分程序的衔接工作,包括语音视频。B:会议架构、模式、重点是数据库的管理、验证操作等。C:实现P2P通讯操作中的各种

6、操作。D:实现传文件功能、整个聊天室会议的建立。E:建立服务器,构建比较完整的服务器。1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。每人都上网查有关WEB会议系统的资料。主要是能够对此次课设的进行扩充内容及要求有进一步的了解,使功能更完善,要求是在上次综合实验的基础上对内容。2.根据实现的功能,划分出合理的模块,明确模块间的关系。3.编程实现所设计的程序。4.程序调试与测试。5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。6.编写课程设计报告;二、所需要的知识:通过自己所学到的课本知识,充分运用Socket,多线程,信道注册,网络编程,数据

7、库的操作等知识实现本组的IM会议系统。1.3具体完成的设计内容由于人员分工问题,我们组5个人各有不同分工,但是都是在一起讨论研究,怎样去实现,怎样实现是最好最简单,最快速的。设计的主要内容涵盖:1、登录服务器-数据库验证-返回 :正确-进入主窗体 错误:重新登录2、主窗体里的Form_Load 开启监听,接收用户列表、上线、下线、会议创建。3、创建会议成功传入服务器-保存到数据库-参加会议-登录验证-服务器4、验证- 数据库验证-返回。5、聊天-悄悄话-群聊广播-保存-消息据路漫游。6、消息记录-调用-反馈服务器-数据库反馈-窗体显示。7、主窗体双击单聊-主要是开启不同的端口号,协调好不同单聊

8、个数的端口。8、发送文件-同步异步、现实进度条。9 、视频控制、多人视频群发,接受视频和发送视频。10、 语音聊天-实现从录音中 把 缓存字节发送到客户端 并成功接析。而我在这里面讨论中主要负责语音、视频的开发研究工作,对大家的连接要求做好规定。2 需求分析2.1信息需求这个IM会议系统信息需求要5个步骤:(1)安装软件客户端安装,服务器断开器。(2)运行,注册或登录,填写验证信息进行数据库验证。(3)正在登录窗体,联系到服务器并有服务器验证,正确的话进入主窗体。(4) 在主窗体中可以P2P聊天各种操作,然后可以建立会议室,参加会议(5)在会议中进行视频、传文件、查看消息记录的功能。2.2功能

9、需求整个IM会议系统分为服务器需求、和客户端功能需求:首先是服务器:(1)服务器需要监听并时刻把所要连接的客户端加进来,并更新所有客户端的在线列表、会议列表。(2)服务器要执行数据库的操作:根据验证信息进行数据库验证、显示所有注册人员信息、保存会议信息、保存会议记录、查看会议记录等功能。其次是客户端:(1)客户端要建立起有好的界面关系,使用户一接触便能使用的功能。(2)登录窗体要做好是登录以及在登录途中退出的各种信息设置、添加各种调制信息,以免bug的出现。(3)主窗体要实现和QQ同样的双机私聊功能,设置在线人员列表图片,并添加修改个人信息的功能。(4)增加来电提示、上线提示、消息提示等提示功

10、能。(5)会议创建参加要有密码进入,一个用户只能同步参加一个会议,其他的必须排队等待,(6)在会议中要显示创建人员,参加人员,会议内容,并对消息记录进行保存。(7)在会议中添加传送文件,发送视频功能,参加人员可以传文件,但是只能接受视频,不能开启视频。3 详细设计3.1操作流程(1) 首先是服务器的启动:如图所示,图 1 服务器显示。(2)客户端登录界面,如图所示,图2 客户端登陆界面(3)系统登录验证界面,如图演示,图 3 系统登录界面(4)登陆后的主窗体显示,图 4 登陆后的主窗体图 5 私聊窗体显示(6)会议室的建立,如图显示, 图 6 创建会议窗体 图 7 会议列表显示窗体以及参加会议

11、输入密码提示窗体, 图 8 参加会议人员进入会议窗体(7)整个会议室主窗体的显示, 图 9 会议室窗体(8)消息记录显示按钮功能, 图 10 显示消息记录功能(9)传送文件显示功能 图 11 创建人发送文件给参加人员(10)视频聊天显示功能 图 12 视频会议图片3.2部分详细设计1、发送文件部分:发送文件的操作其实还可以在扩加功能,共享文件,对参加会议的人员进行内容共享。其方法就是把文件传至服务器,保存到服务器硬盘中,参加会议人员可以下载,其形式和查看消息记录差不多。在发送文件的时候,先是把 文件的名字,文件的大小传至接收人员客户端,等接收人员客户端解析以后,开始传送,在传送的时候,用Beg

12、inInvoke()方法进行异步界面更新发送进度。接收方法和发送的差不多主要是先开始监听,代码就不说了。主要代码如下:private void 发送文件ToolStripMenuItem1_Click(object sender, EventArgs e) if (listBox1.SelectedItem = null) MessageBox.Show(请先选择指定对象!,提示); return; b = new Thread(new ThreadStart(this.send); b.IsBackground = true; b.Start(); this.Donghua(); priva

13、te void send()/发送文件的方法 string host = listBox1.SelectedItem.ToString(); string HostIp = null; for (int i = 0; i list_user.Count; i+) PerInfo p = (PerInfo)list_useri; if (host = p.name) HostIp = p.IP; break; try TcpClient client = new TcpClient(HostIp, 16); NetworkStream ns = client.GetStream(); OpenF

14、ileDialog aa = new OpenFileDialog(); if (aa.ShowDialog() = DialogResult.OK) string ss = aa.FileName.Split(); string filename = ssss.Length - 1; FileStream fs = new FileStream(aa.FileName, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); Int64 size = fs.Length; byte bytes = ne

15、w byte1024 * 1024; bytes = Encoding.Unicode.GetBytes(FILE| + size.ToString() + | + filename + |); ns.Write(bytes, 0, bytes.Length); Int64 total = 0; while (total size) int x = br.Read(bytes, 0, bytes.Length); ns.Write(bytes, 0, x); total += x; /this.Invoke(new MethodInvoker(delegate() / progressBar1

16、.Value = Convert.ToInt32(100*(1.0*total/size); / if(progressBar1.Value = 100) / timer1.Enabled = false; /); Gengxin me = new Gengxin(this.myinvoke); BeginInvoke(me, Convert.ToInt32(100.0 * total / size); timer1.Enabled = false; MessageBox.Show(发送完毕); catch private void Donghua() Point p = new Point(

17、255, 124); groupBox1.Location = p; Size s = new Size(118, 192); groupBox1.Size = s; this.panel1.Visible = true; timer1.Enabled = true; time = 0; private void myinvoke(int x)/异步进行更新操作 progressBar1.Value = x; 2、视频部分:视频会议主要是,创建会议人员发送视频,其他人接收视频,只能看到创建人员视频开始调用引入系统函数获取接收开启视频的指令,等time1好使就开始发送视频,并且自己接受自己视频。

18、主要代码: private void Start_Receiving_Video_Conference()/接收视频信号 try / Open The Port mytcpl = new TcpListener(8000); mytcpl.Start(); / Start Listening on That Port mysocket = mytcpl.AcceptSocket(); / Accept Any Request From Client and Start a Session ns = new NetworkStream(mysocket); / Receives The Bina

19、ry Data From Port pictureBox1.Image = Image.FromStream(ns); mytcpl.Stop(); / Close TCP Session if (mysocket.Connected = true) / Looping While Connected to Receive Another Message while (true) Start_Receiving_Video_Conference(); / Back to First Method myns.Flush(); catch (Exception) private void Star

20、t_Sending_Video_Conference(string remote_IP, int port_number)/通过知道对方的IP和端口号,给对方发送视频 try ms = new MemoryStream();/ Store it in Binary Array as Stream pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); byte arrImage = ms.GetBuffer(); myclient = new TcpClient(remote_IP, port_number);/

21、Connecting with server myns = myclient.GetStream(); mysw = new BinaryWriter(myns); mysw.Write(arrImage);/send the stream to above address ms.Flush(); mysw.Flush(); myns.Flush(); ms.Close(); mysw.Close(); myns.Close(); myclient.Close(); catch (Exception ex) Capturing.Enabled = false; MessageBox.Show(

22、ex.Message, Video Conference Error Message, MessageBoxButtons.OK, MessageBoxIcon.Error); private void WebCamCapture_ImageCaptured(object source, WebCam_Capture.WebcamEventArgs e) this.pictureBox1.Image = e.WebCamImage; private void 结束视频ToolStripMenuItem_Click(object sender, EventArgs e) this.WebCamC

23、apture.Stop(); Capturing.Enabled = false; Size p = new Size(427, 433); this.Size = p; string mes = VedioEnd|; byte bytes = Encoding.Unicode.GetBytes(mes); for (int i = 0; i list_user.Count; i+) PerInfo sa = (PerInfo)list_useri; if (sa.name != login.user_name) TcpClient client = new TcpClient(sa.IP,

24、16); NetworkStream ns = client.GetStream(); ns.Write(bytes, 0, bytes.Length); client.Close(); 4 调试分析、测试结果1、在用户登录后由于异常造成的二次登陆后,在主窗体上显示自己名字2遍,创建的会议也会同时显示2遍的bug。如图所示,图13 登录异常显示图调试结果,在服务器里增加判断,如果人员下线或异常下线的话,删除在线用户列表中的该用户信息,会议保留。调试结果运行正确。2、在视频发送文件会议室里,开视频查看会议记录的时候,就会把视频给挡上,使视频给覆盖,只有关闭消息记录才可以显示视频内容,在发送文件的

25、时候,没有屏蔽掉给自己传的功能,不能给自己传,错误结果如图所示, 图 14 给自己传送文件的错误代码修改后,在自己那块加了个遍历屏蔽。就不能给自己传文件了。5 总结本次课程设计让我明白了一个人的力量的弱小和不足,通过这次课程设计,我发现自己对知识掌握还存在着很多的不足之处,同时我也明白了自己还有哪些地方需要改进,自己要在哪些地方进行自我的提升。尤为重要的是,这次课程设计使我们懂得了理论与实际相结合是很重要的。在这次课程设计中,我虽然遇到一些困难,但我仍能坚持克服。通过这个小小的课题,我们也学到了一些课外的东西,多谢学校给了我们一次体验的机会,谢谢老师在我困难的时候给我们的指导,也谢谢在这段时间

26、给过我们帮助的同学,在把核心代码通过可视化界面实现,需要建立许多接口函数,由输入接口接受数据,需要入口函数。把核心代码运算的结果输出到界面,需要输口函数。而且体会到可视化程序设计,能更好的理解程序的运行机制,有助于更好的设计程序。加深对该课程的理解,在这次设计过程中使我对C#的开发建立了浓厚的兴趣。以后我会好好努力的!通过这次的课程设计,使我了解了一个简单的网络视频会议系统的设计过程,并且更进一步掌握了SQL server 2005的基本用法,和Visual Studio 2005的基本用法;掌握C#高级编程技术课程的基本知识及其应用情况,对数据库的运用操作;学会了采用结构化、模块化程序设计方

27、法进行程序设计,在这次设计过程中使我对高级编程和数据库的开发建立了浓厚的兴趣,并且了解到一个项目软件是怎样产生的,以及制作的流水过程。本系统基本完成了一个视频会议系统所需求的功能如文件传输、视频传输、文字传输、文件保存等但由于本人技术有限,导致主界面不够简洁。先前设计的代码很复杂,最后进行了精简修改,使得代码基本符合规范化设计。其中视图间通信的方式,都是采用刷新的办法,因此有闪烁的现象。由于本人的经验有限,设计方法经验欠缺,导致软件的不成熟,是软件开发的一大遗憾。从此次设计编码,足见我需要更加努力。我会在未来延续这种思维,开拓自己的设计开发思想。6 结束语经过这次课程设计,我学到了很多只是,也

28、重新将以前学过的知识复习一遍,对C#的知识也有了更一步的提高,受益颇深。在这次过程中,遇到许多意想不到的问题,在老师和同学的帮助下得到了解决,谢谢大家的帮助。我会找出我的不足,通过努力学习把它填不上。我由衷的感谢大家。感谢老师的教导,谢谢老师的努力。7 程序清单namespace IM会议客户端/Login登录代码 public partial class login : Form public login() InitializeComponent(); public static string server; public static string user_name; public s

29、tatic string user_psw; private void button1_Click(object sender, EventArgs e) if (textBox2.Text = | textBox3.Text = ) MessageBox.Show(用户名或密码不能为空!,提示,MessageBoxButtons.OK,MessageBoxIcon.Exclamation); textBox2.Focus(); return; server = textBox1.Text.Trim(); user_name = textBox2.Text.Trim(); user_psw =

30、 textBox3.Text.Trim(); this.DialogResult = DialogResult.OK; private void button2_Click(object sender, EventArgs e) this.DialogResult = DialogResult.Cancel; Application.Exit(); private void textBox3_KeyDown(object sender, KeyEventArgs e) if (e.KeyValue = 13) button1_Click(this,null); private void lin

31、kLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) Register r = new Register(); r.Show(); namespace IM会议客户端 /正在登录代码 public partial class IM_Loading : Form public IM_Loading() Control.CheckForIllegalCrossThreadCalls = false; InitializeComponent(); private Socket sock,socket,clientsoc

32、k; DialogResult dr; private Thread a; private login f; private void Loading_Load(object sender, EventArgs e) re_login(); private void re_login() f = new login(); dr = f.ShowDialog(); f.Close(); a = new Thread(new ThreadStart(this.user_login); a.IsBackground = true; a.Start(); private void user_login

33、() this.Visible = true; sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sock.Blocking = true; try IPEndPoint ep = new IPEndPoint(IPAddress.Parse(login.server),14); sock.Connect(ep); catch MessageBox.Show(网络连接失败,请查看网络连接!, 提示, MessageBoxButtons.OK, MessageBoxIcon.In

34、formation); this.Visible = false; re_login(); string login_info = JOIN| + login.user_name + | + login.user_psw + |; byte recs = Encoding.Unicode.GetBytes(login_info); sock.Send(recs); NetworkStream ns = new NetworkStream(sock); int bt = ns.ReadByte(); if (bt = 0) MessageBox.Show(用户名或密码错误!, 提示, Messa

35、geBoxButtons.OK, MessageBoxIcon.Exclamation); this.Visible = false; re_login(); else sock.Close(); this.Visible = false; this.Invoke(new MethodInvoker(delegate() MainForm mf = new MainForm(); mf.Show(); ); private void button1_Click(object sender, EventArgs e) this.Hide(); re_login(); namespace IM会议

36、客户端 /主窗体代码 public partial class MainForm : Form public MainForm() CheckForIllegalCrossThreadCalls = false; InitializeComponent(); private Socket sock, clientsock; private Thread a; private struct PerInfo public string IP, name; public PerInfo(string ip, string _name) this.IP = ip; this.name = _name;

37、 ; public static ArrayList list = new ArrayList(); public static int port = 17; public static ArrayList meeting_list = new ArrayList(); private delegate void myinvoke(string s); private delegate void MYinvoke(string s); private void MainForm_Load(object sender, EventArgs e) a = new Thread(new Thread

38、Start(this.start); a.IsBackground = true; a.Start(); private void start() IPHostEntry ip = Dns.GetHostByName(Dns.GetHostName(); IPEndPoint ep = new IPEndPoint(ip.AddressList0, 15); sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sock.Blocking = true; sock.Bind(ep)

39、; sock.Listen(-1); while (true) try clientsock = sock.Accept(); if (clientsock.Connected) Thread c = new Thread(new ThreadStart(this.receive); c.IsBackground = true; c.Start(); catch private void list_add(string s) int count = this.listView2.Items.Count; listView2.Items.Insert(count, new ListViewIte

40、m(new string s); listView2.Itemscount.ImageIndex = count % 4; private void user_on(string s) SoundPlayer sound = new SoundPlayer(Global.wav); sound.Play(); this.panel1.Visible = true; Point p = new Point(49,365); this.panel1.Location = p; label1.Text = ; label1.Text += s + 上线了; System.Threading.Thre

41、ad.Sleep(5000); this.panel1.Visible = false; private void receive() Socket s = clientsock; byte recs = new byte32767; try s.Receive(recs); catch string mes = Encoding.Unicode.GetString(recs).Split(|); if (mes0 = JOIN) myinvoke me = new myinvoke(this.user_on); BeginInvoke(me,mes1); else if (mes0 = LI

42、ST) list.Clear(); for (int i = 1; i mes.Length-1; i+) string token = mesi.Split(:); PerInfo p = new PerInfo(token0,token1); list.Add(p); this.Invoke(new MethodInvoker(delegate() listView2.Items.Clear(); ); for (int i = 1; i mes.Length-1; i+) string token = mesi.Split(:); MYinvoke me = new MYinvoke(this.list_add); BeginInvoke(me, token0); else if (mes0 = PRIV) this.Invoke(new MethodInvoker(delegate() Per_Receive pr = new Per_Receive(mes1,mes2,Convert.ToInt32(mes3); pr.Show(); ); else

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!