面向对象程序设计课程设计-IM通讯会议系统.doc_第1页
面向对象程序设计课程设计-IM通讯会议系统.doc_第2页
面向对象程序设计课程设计-IM通讯会议系统.doc_第3页
面向对象程序设计课程设计-IM通讯会议系统.doc_第4页
面向对象程序设计课程设计-IM通讯会议系统.doc_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高级编程程序设计高级编程程序设计 院 系: 计算机科学技术学院软件工程系 班 级: 软件 08 1 班 姓 名: XXX 学 号: 5 号 合 作 者: XX XXX XXX XXX 指导教师: XXX 2010 年 7 月 24 日 IMIMIM 通通通通讯讯讯讯会会会会议议议议系系系系统统统统 面向对象程序设计任务书面向对象程序设计任务书 一、题目:视频会议系统一、题目:视频会议系统 二、设计要求二、设计要求 (1 组成课程设计小组。 (2)小组成员分工协作完成。要求每个成员有自己相对独立的模块,同时 要了解其他组员完成的内容。 (3)查阅相关资料,自学具体课题中涉及到的新知识。 (4)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。 (5)所设计的系统应有对数据库操作。 (6)按要求写出课程设计报告,并于设计结束后 1 周内提交。其主要内容 包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求 分析、总体设计、详细设计、程序的调试与测试、总结与体会、结束语、程序 清单(带中文注释) 、参考文献等。 三、课程设计工作量三、课程设计工作量 由于是设计小组团结协作完成设计任务,一般每人的程序量在 200 行有效 程序行左右,不得抄袭。 四、课程设计工作计划四、课程设计工作计划 2010 年 6 月 30 日前,指导教师讲课,学生根据题目准备资料,需求分析; 2010 年 6 月 30 日,设计小组进行总体方案设计和任务分工; 2010 年 7 月 1 日,提交软件总体模块结构图和分工方案; 2010 年 7 月 1 日2010 年 7 月 6 日,每人完成自己承担的程序模块并通过 独立编译; 2010 年 7 月 21 日2010 年 7 月 22 日,将各模块集成为一个完整的系统, 并录入足够的数据进行调试运行,数据必须存储到磁盘文件中,已备验收; 2010 年 7 月 23 日,验收、开始撰写课程设计报告; 2010 年 7 月 25 日前,提交课程设计报告,并将软件的源文件及报告的 word 文档打印交到老师办公室里。 指导教师签章: 教研室主任签章 高级编程课程设计指导教师评语与成绩 指导教师评语: 课程设计表现成绩: 课程设计验收成绩: 课程设计报告成绩: 课程设计 总成绩: 指导教师签章 20010 年 7 月 日 I 目 录 1 概述概述 .1 1.1 研究的背景及意义.1 1.2 设计的任务和需要的知识点.1 1.3 具体完成的设计内容.2 2 需求分析需求分析.3 2.1 信息需求.3 2.2 功能需求.3 3 详细设计详细设计.4 3.1操作流程.4 3.2 部分详细设计.10 4 调试分析、测试结果调试分析、测试结果.16 5 总结总结.18 6 结束语结束语.20 7程序清单程序清单.22 参考文献参考文献 .50 1 1 概述概述 1.1 研究的背景及意义研究的背景及意义 C#高级编程课程设计是软件工程专业实践性重要环节之一,是学习完 C#高级编程课程后进行的一次较全面的综合练习。其目的在于加深对编程 的理论、方法和基础知识的理解,掌握编程实现机理和各种典型算法,系统地 了解编程的设计和实现思路,培养学生的系统设计能力,并了解编程的发展动 向和趋势。 根据老师的要求: 1、 以小组为单位,延续上学期面向对象程序设计课设分组形式,由李秀鹏 任项目经理,臧艳协助工作。 2、 以最后一次综合实验 QQ 程序为基础,进行扩展。要求班长课代表带领 同学上网查阅相关资料,了解目前已有网上会议系统基本情况,结合自己所学 加以实现。 3、 课设中要充分应用到本学期课程所学知识,必须包含 Internet 编程、多 线程编程、数据库技术、Win Form 程序开发等相关知识。 4、 可结合已有技术、自查资料等对该系统进行扩展开发,如加入视频、语 音功能等。 通过自己所学到的课本知识,充分运用 Socket,多线程,信道注册,网络 编程,数据库的操作等知识实现本组的 IM 会议系统。 1.2 设计的任务和需要的知识点设计的任务和需要的知识点 一、设计的任务分工:一、设计的任务分工: A:负责完成大部分程序的衔接工作,包括语音视频。 B:会议架构、模式、重点是数据库的管理、验证操作等。 C:实现 P2P 通讯操作中的各种操作。 D:实现传文件功能、整个聊天室会议的建立。 E:建立服务器,构建比较完整的服务器。 1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。每人 都上网查有关 WEB 会议系统的资料。主要是能够对此次课设的进行扩充内容 及要求有进一步的了解,使功能更完善,要求是在上次综合实验的基础上对内 2 容。 2.根据实现的功能,划分出合理的模块,明确模块间的关系。 3.编程实现所设计的程序。 4.程序调试与测试。 5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输入及 其输出结果。 6.编写课程设计报告; 二、所需要的知识:二、所需要的知识: 通过自己所学到的课本知识,充分运用 Socket,多线程,信道注册,网络 编程,数据库的操作等知识实现本组的 IM 会议系统。 1.3 具体完成的设计内容具体完成的设计内容 由于人员分工问题,我们组 5 个人各有不同分工,但是都是在一起讨论研 究,怎样去实现,怎样实现是最好最简单,最快速的。 设计的主要内容涵盖: 1、登录服务器-数据库验证-返回 :正确-进入主窗体 错误: 重新登录 2、主窗体里的 Form_Load 开启监听,接收用户列表、上线、下线、会议 创建。 3、创建会议成功传入服务器-保存到数据库-参加会议-登 录验证-服务器 4、验证- 数据库验证-返回。 5、聊天-悄悄话-群聊广播-保存-消息据路漫游。 6、消息记录-调用-反馈服务器-数据库反馈-窗体显示。 7、主窗体双击单聊-主要是开启不同的端口号,协调好不同单聊个数的 端口。 8、发送文件-同步异步、现实进度条。 9 、视频控制、多人视频群发,接受视频和发送视频。 10、 语音聊天-实现从录音中 把 缓存字节发送到客户端 并成功接析。 而我在这里面讨论中主要负责语音、视频的开发研究工作,对大家的连接 要求做好规定。 3 2 需求分析需求分析 2.1 信息需求信息需求 这个 IM 会议系统信息需求要 5 个步骤: (1)安装软件客户端安装,服务器断开器。 (2) 运行,注册或登录,填写验证信息进行数据库验证。 (3)正在登录窗体,联系到服务器并有服务器验证,正确的话进入主窗体。 (4) 在主窗体中可以P2P聊天各种操作,然后可以建立会议室,参加会议 (5)在会议中进行视频、传文件、查看消息记录的功能。 2.2 功能需求功能需求 整个 IM 会议系统分为服务器需求、和客户端功能需求: 首先是服务器: (1)服务器需要监听并时刻把所要连接的客户端加进来,并更新所有客户 端的在线列表、会议列表。 (2)服务器要执行数据库的操作:根据验证信息进行数据库验证、显示所有 注册人员信息、保存会议信息、保存会议记录、查看会议记录等功能。 其次是客户端: (1)客户端要建立起有好的界面关系,使用户一接触便能使用的功能。 (2)登录窗体要做好是登录以及在登录途中退出的各种信息设置、添加各 种调制信息,以免 bug 的出现。 (3)主窗体要实现和 QQ 同样的双机私聊功能,设置在线人员列表图片, 并添加修改个人信息的功能。 (4)增加来电提示、上线提示、消息提示等提示功能。 (5)会议创建参加要有密码进入,一个用户只能同步参加一个会议,其他 的必须排队等待, (6)在会议中要显示创建人员,参加人员,会议内容,并对消息记录进行 保存。 (7)在会议中添加传送文件,发送视频功能,参加人员可以传文件,但是 只能接受视频,不能开启视频。 4 3 详细设计详细设计 3.1 操作流程 (1) 首先是服务器的启动:如图所示, 图 1 服务器显示。 (2)客户端登录界面,如图所示, 5 图 2 客户端登陆界面 (3)系统登录验证界面,如图演示, 图 3 系统登录界面 (4)登陆后的主窗体显示, 6 图 4 登陆后的主窗体 图 5 私聊窗体显示 (6)会议室的建立,如图显示, 7 图 6 创建会议窗体 图 7 会议列表显示窗体 以及参加会议输入密码提示窗体, 8 图 8 参加会议人员进入会议窗体 (7)整个会议室主窗体的显示, 图 9 会议室窗体 (8)消息记录显示按钮功能, 9 图 10 显示消息记录功能 (9)传送文件显示功能 图 11 创建人发送文件给参加人员 (10)视频聊天显示功能 10 图 12 视频会议图片 3.2 部分详细设计 1、发送文件部分: 发送文件的操作其实还可以在扩加功能,共享文件,对参加会议的人员进 行内容共享。 其方法就是把文件传至服务器,保存到服务器硬盘中,参加会议人员可以 下载,其形式和查看消息记录差不多。 在发送文件的时候,先是把 文件的名字,文件的大小传至接收人员客户 端,等接收人员客户端解析以后,开始传送,在传送的时候,用 BeginInvoke()方法进行异步界面更新发送进度。 接收方法和发送的差不多主要是先开始监听,代码就不说了。 主要代码如下: private void 发送文件ToolStripMenuItem1_Click(object sender, EventArgs e) if (listBox1.SelectedItem = null) 11 MessageBox.Show(请先选择指定对象!,提示); return; b = new Thread(new ThreadStart(this.send); b.IsBackground = true; b.Start(); this.Donghua(); private 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 = ) HostIp = p.IP; break; try TcpClient client = new TcpClient(HostIp, 16); NetworkStream ns = client.GetStream(); OpenFileDialog 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 = new byte1024 * 1024; bytes = Encoding.Unicode.GetBytes(FILE| + 12 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.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(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; 13 2、视频部分: 视频会议主要是,创建会议人员发送视频,其他人接收视频,只能看到创 建人员视频 开始调用引入系统函数获取接收开启视频的指令,等 time1 好使就开始发 送视频,并且自己接受自己视频。主要代码: 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 Binary 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 Start_Sending_Video_Conference(string remote_IP, int port_number)/通过知道对方的IP和端口号,给对方发送视频 try 14 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);/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(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.WebCamCapture.Stop(); Capturing.Enabled = false; Size p = new Size(427, 433); this.Size = p; string mes = VedioEnd|; 15 byte bytes = Encoding.Unicode.GetBytes(mes); for (int i = 0; i list_user.Count; i+) PerInfo sa = (PerInfo)list_useri; if ( != login.user_name) TcpClient client = new TcpClient(sa.IP, 16); NetworkStream ns = client.GetStream(); ns.Write(bytes, 0, bytes.Length); client.Close(); 16 4 调试分析、测试结果调试分析、测试结果 1、在用户登录后由于异常造成的二次登陆后,在主窗体上显示自己名字 2 遍,创建的会议也会同时显示 2 遍的 bug。 如图所示, 图 13 登录异常显示图 调试结果,在服务器里增加判断,如果人员下线或异常下线的话,删除在 线用户列表中的该用户信息,会议保留。 调试结果运行正确。 2、在视频发送文件会议室里,开视频查看会议记录的时候,就会把视频给 挡上,使视频给覆盖,只有关闭消息记录才可以显示视频内容, 在发送文件的时候,没有屏蔽掉给自己传的功能,不能给自己传,错误结 果如图所示, 17 图 14 给自己传送文件的错误 代码修改后,在自己那块加了个遍历屏蔽。就不能给自己传文件了。 18 5 总结总结 本次课程设计让我明白了一个人的力量的弱小和不足,通过这次课程设计, 我发现自己对知识掌握还存在着很多的不足之处,同时我也明白了自己还有哪 些地方需要改进,自己要在哪些地方进行自我的提升。尤为重要的是,这次课 程设计使我们懂得了理论与实际相结合是很重要的。 在这次课程设计中,我虽然遇到一些困难,但我仍能坚持克服。通过这个小 小的课题,我们也学到了一些课外的东西,多谢学校给了我们一次体验的机会, 谢谢老师在我困难的时候给我们的指导,也谢谢在这段时间给过我们帮助的同 学,在把核心代码通过可视化界面实现,需要建立许多接口函数,由输入接口 接受数据,需要入口函数。把核心代码运算的结果输出到界面,需要输口函数。 而且体会到可视化程序设计,能更好的理解程序的运行机制,有助于更好的设 计程序。加深对该课程的理解,在这次设计过程中使我对 C#的开发建立了浓厚 的兴趣。以后我会好好努力的! 通过这次的课程设计,使我了解了一个简单的网络视频会议系统的设计过程,并且更 进一步掌握了 SQL server 2005 的基本用法,和 Visual Studio 2005 的基本用法;掌握C#高 级编程技术课程的基本知识及其应用情况,对数据库的运用操作;学会了采用结构化、模 块化程序设计方法进行程序设计,在这次设计过程中使我对高级编程和数据库的开发建立了 浓厚的兴趣,并且了解到一个项目软件是怎样产生的,以及制作的流水过程。 本系统基本完成了一个视频会议系统所需求的功能如文件传输、视频传输、文字传输、 文件保存等但由于本人技术有限,导致主界面不够简洁。先前设计的代码很复杂,最后进 行了精简修改,使得代码基本符合规范化设计。其中视图间通信的方式,都是采用刷新的 办法,因此有闪烁的现象。 由于本人的经验有限,设计方法经验欠缺,导致软件的不成熟,是软件开发的一大遗 憾。从此次设计编码,足见我需要更加努力。我会在未来延续这种思维,开拓自己的设计 开发思想。 19 20 6 结束语结束语 经过这次课程设计,我学到了很多只是,也重新将以前学过的知识复习一 遍,对 C#的知识也有了更一步的提高,受益颇深。在这次过程中,遇到许多意 想不到的问题,在老师和同学的帮助下得到了解决,谢谢大家的帮助。我会找 出我的不足,通过努力学习把它填不上。我由衷的感谢大家。感谢老师的教导, 谢谢老师的努力。 21 22 7程序清单程序清单 namespace IM会议客户端/Login登录代码 public partial class login : Form public login() InitializeComponent(); public static string server; public static string user_name; public static 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 = 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) 23 button1_Click(this,null); private void linkLabel2_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,clientsock; 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(); 24 private void user_login() 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.Information); 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(用户名或密码错误!, 提示, MessageBoxButtons.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(); 25 ); private void button1_Click(object sender, EventArgs e) this.Hide(); re_login(); namespace IM会议客户端 /主窗体代码 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; = _name; ; 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 ThreadStart(this.start); 26 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); 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 ListViewItem(new string s); listView2.Itemscount.ImageIndex = count % 4; priva

温馨提示

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

评论

0/150

提交评论