《聊天室课程设计聊天程序的设计和实现.doc》由会员分享,可在线阅读,更多相关《聊天室课程设计聊天程序的设计和实现.doc(29页珍藏版)》请在三一办公上搜索。
1、 计算机网络课程设计 题目:聊天程序的设计和实现学院:计算机 课程设计指导教师评定成绩表 项目分值优秀(100x90)良好(90x80)中等(80x70)及格(70x60)不及格(xx90)良好(90x80)中等(80x70)及格(70x60)不及格(xx90)良好(90x80)中等(80x70)及格(70x60)不及格(x60)评分参考标准参考标准参考标准参考标准参考标准学习态度15学习态度认真,科学作风严谨,严格保证设计时间并按任务书中规定的进度开展各项工作学习态度比较认真,科学作风良好,能按期圆满完成任务书规定的任务学习态度尚好,遵守组织纪律,基本保证设计时间,按期完成各项工作学习态度尚
2、可,能遵守组织纪律,能按期完成任务学习马虎,纪律涣散,工作作风不严谨,不能保证设计时间和进度技术水平与实际能力25设计合理、理论分析与计算正确,实验数据准确,有很强的实际动手能力、经济分析能力和计算机应用能力,文献查阅能力强、引用合理、调查调研非常合理、可信设计合理、理论分析与计算正确,实验数据比较准确,有较强的实际动手能力、经济分析能力和计算机应用能力,文献引用、调查调研比较合理、可信设计合理,理论分析与计算基本正确,实验数据比较准确,有一定的实际动手能力,主要文献引用、调查调研比较可信设计基本合理,理论分析与计算无大错,实验数据无大错设计不合理,理论分析与计算有原则错误,实验数据不可靠,实
3、际动手能力差,文献引用、调查调研有较大的问题创新10有重大改进或独特见解,有一定实用价值有较大改进或新颖的见解,实用性尚可有一定改进或新的见解有一定见解观念陈旧论文(计算书、图纸)撰写质量50结构严谨,逻辑性强,层次清晰,语言准确,文字流畅,完全符合规范化要求,书写工整或用计算机打印成文;图纸非常工整、清晰结构合理,符合逻辑,文章层次分明,语言准确,文字流畅,符合规范化要求,书写工整或用计算机打印成文;图纸工整、清晰结构合理,层次较为分明,文理通顺,基本达到规范化要求,书写比较工整;图纸比较工整、清晰结构基本合理,逻辑基本清楚,文字尚通顺,勉强达到规范化要求;图纸比较工整内容空泛,结构混乱,文
4、字表达不清,错别字较多,达不到规范化要求;图纸不工整或不清晰指导教师评定成绩:指导教师签名: 年 月 日重庆大学本科学生课程设计任务书课程设计题目计算机网络课程设计学院计算机学院专业网络工程年级2009已知参数和设计要求:通过计算机网络的课程设计,使学生了解、掌握TCP、UDP协议的原理;了解、掌握利用Winsock API编程的方法;了解、掌握应用协议设计的思想;利用Winsock API编制一个能部署在Internet上的点对点数据交换(P2P)、HTTP/FTP服务器系统、共享白板。要求每组学生(3人/组)从上述3个系统中任选一个,独立完成系统的功能设计和实现,使所实现的系统可以能够包含
5、主要的内容要求,并要求学生必须在报告中明确具体分工情况。学生应完成的工作:分组 3人/组。 内容:协议编程。语言:JAVA/C+。3个题目任意选一个1) 点对点数据交换(P2P):实现基于服务器转发的任意多点间的数据共享与交换。2) HTTP/FTP服务器系统:HTTP/FTP客户端系统和HTTP/FTP服务端系统。3) 共享白板:实现基于服务器转发的多点间的文字,简单图案等信息的远程实时共享。目前资料收集情况(含指定参考资料):1) 计算机网络第4版 谢希仁 电子工业出版社 2003年.6月2) 用TCP/IP进行网络互联(第一卷)D.E.Comer 电子工业出版社2004年.11月第四版3
6、) TCP/IP网络原理与技术 周明天、汪文勇:清华大学出版社:19934) JAVA网络高级编程 殷兆麟 清华大学出版社 2005.55) Visual C+网络高级编程,陈坚,人民邮电出版社,2001年08月课程设计的工作计划:1需求分析(说明系统目的,要求,操作流程,开发工具与开发平台)2总体设计(描述系统功能,系统架构,模块化分)3详细设计(建立系统的数据结构,协议结构,数据流程图)4系统实现编码(用所选开发工具完成应用系统)任务下达日期 2012 年 1 月 5 日完成日期 2012 年 1 月 11 日指导教师 (签名)学 生 (签名)说明:1、学院、专业、年级均填全称,如:光电工
7、程学院、测控技术、2003。2、本表除签名外均可采用计算机打印。本表不够,可另附页,但应在页脚添加页码。目 录摘 要2一 需求分析31.1 开发背景31.2 功能要求31.3 主要涉及的编程知识31.4 编程语言及环境3二 总体设计42.1 系统实现的基本原理42.2 系统功能52.2.1服务器端的主要功能52.2.2客户端的主要功能52.3 系统运行数据流程图62.4 功能模块72.4.1 服务器功能模块流程图72.4.2 客户端功能模块流程图8三 详细设计93.1系统体系协议设计93.2聊天室服务器端设计103.2.1 ChatServer类103.2.2 ClientProc类113.3
8、聊天室客户端设计133.3.1 ChatFrame类133.3.2 Connect类163.3.3 Plist类163.3.4 PopupListener类163.3.5 Acceptfilethread&Sendfilethread类16四 系统实现与调试分析184.1聊天室服务器运行效果184.2聊天室客户端用例运行效果194.3结果分析与问题解决21五 总 结22参考文献23摘 要随着“E时代”的到来 ,网络观念深入人心。网络聊天室是在一个网站中,供许多人通过文字与符号进行实时(您输入的内容马上就能被别人看见)交谈、聊天的场所,它是一个向整个因特网开放的地方。为了加深理解和应用网络编程,
9、实现网络聊天的功能,本次课程设计采用Windows Socket编程,服务器与客户端采用了TCP/IP连接方式,在设计聊天方案时,实行将所有信息发往服务器端,再由服务器进行分别处理的思路,服务器端是所有信息的中心。本聊天室程序设计基于C/S模式,聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登陆到服务器才可以实现正常的聊天功能。而聊天系统是一个开放的基于Java的应用开发设计,其主要特点是动态的,实时的来完成信息的传递,并拥有大量的客户请求的高效互动,更有效地处理。本文围绕Java编程语言在网络编程方面的具体应用,论述了使用面向对象方法,对程序进行如下探
10、讨: 1需求分析 2总体设计 3详细设计最后使用Java编程实现的全过程。在编程我们使用的java语言,是目前比较流行的编程语言。Java语言最大的特点是具有跨平台性,使其不受平台不同的影响,得到了广泛的应用。本次课程设计的详细分工如下:20095544张驹强,完成本次实验服务器设计与聊天室信息传输控制协议的设计等过程,并参与文档与测试工作,占总工作量的33.3%;20095545张源,完成本次系统功能流程设计与文件收发功能的设计等过程,并参与文档与测试工作,占总工作量的33.3%;20095547朱俊逸,完成本次实验聊天室数据结构设计等过程,并参与文档与测试工作,占总工作量的33.3%。关键
11、词: 聊天室,JAVA,Windows Socket一 需求分析1.1 开发背景在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ、网络聊天一类的聊天系统的发展日新月异。因此,我门设计了这个网络聊天工具的,而且通过制作该程序还能更好的学习网络软件编程知识。本系统所要实现的主要功能是为广大用户提供一个借助网络进行人际交往的平台。因为服务器端采用多线程,所以性能有很大提升。因为服务端和客户端之间采用TCP协议进行网络通信,建立的是可靠的、端到端的网络连接,所以可靠性和安全性都很好。1.2 功能要求(1) 服务器功能,用于监听与发送广播信息;(
12、2) 客户登录功能;(3) 客户可以一对一和多对多聊天功能;(4) 客户端程序可以实时显示其它在线的用户;(5)客户之间可以点对点传输文件。1.3 主要涉及的编程知识基于TCP的Socket通信编程、GUI程序设计、事件处理、多线程技术、输入输出处理、异常处理等。1.4 编程语言及环境在编程中我们使用的是目前比较流行的编程语言-java语言。 开发环境选择了IBM公司研发的Eclipse SDK 3.7.0版本。二 总体设计为实现网络聊天的功能,本次课程设计采用Winsock API编程,服务器与客户端采用了TCP/IP连接方式,同时,聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦
13、听与转发客户端发来的消息,客户端需登陆到服务器才可以实现正常的聊天功能。2.1 系统实现的基本原理本系统在Microsoft Windows下通过TCP协议建立网络应用程序,需要使用Socket套接口编程技术。所谓socket通常也称作套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求。以J2SDK-1.3为例,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差
14、别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。连接确认:是指当服务器端套接
15、字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。 开发原理: 服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。 客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭
16、Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述
17、符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 2.2 系统功能2.2.1服务器端的主要功能1. 启动后进行监听,等待客户端连接;2. 显示系统各种工作的信息,如用户上线和用户信息交流等信息;3. 显示在线用户信息;4. 向已经连接到服务端的用户发送广播消息和系统信息;5. 退出时,断开所有的用户连接。2.2.2客户端的主要功能1. 登录功能,连接到已经开启的服务器并可以随时登录和注销;2. 用户可以配置要连接服务器端的IP地址和端口号;3. 用户可以设置自己的用户名与性别;4. 用户可以向所有人或者个人发送群消息或私聊消息;5. 用户可以点对点发送和接受文件。2.3 系统运
18、行数据流程图客户端进入聊天室退出聊天室发送普通信息发送悄悄话刷新聊天列表聊天记录框 服务器端PEOPLE+名字+性别终止并离开当前的客户端线程向某一客户端发送所有线程的:PEOPLE+名字+性别图2-12.4 功能模块2.4.1 服务器功能模块流程图Server端创建ServerSocket对象,在某端口提供监听服务Client端等待来自Client端的服务请求接受Client端的请求,用返回的Socket建立连接通过向Socket中读写数据来与Client端通信关闭Socket,结束与Server端的通信通过向新的Socket中读写数据来与Server端通信创建Socket对象,向Serve
19、r的监听端口请求关闭Socket,结束与当前Client的通信,等待其他请求关闭ServerSocket对象,结束监听服务建立连接数据通信拆分连接图2-22.4.2 客户端功能模块流程图图2-3三 详细设计功能传输方向控制信息用户登录用户 服务器name&sex反馈重名信息服务器 用户samename反馈不重名信息服务器 用户nosamename用户注销用户 服务器quit用户登录提示服务器 ALLnew&name&sex刷新下拉菜单列表服务器 ALLresetselect&name&name2刷新在线用户列表服务器 ALLresetplist&name.sex&.3.1系统体系协议设计取消发
20、送文件源 服务器 cancelsendfile+&+目标name服务器 目标 cancelsendfile+&+源name发送文件源 服务器 sendfile&目标name&路径+源IP+&+源端口+大小服务器 目标sendfile&源name+&路径&源IP&端口+&大小接受文件目标 服务器acceptfile&源目标服务器 源acceptfile&目标拒绝接受文件目标 服务器refusefile+&+源name服务器 源refusefile+&+目标name群聊 源 服务器 内容服务器 ALL 源name+:+内容公开私聊源 服务器 ”whitwho”+&+privateFalse+&+目
21、标name+&+内容服务器 ALL“whitwho”+&+源name+&+目标name+&+内容私聊源 服务器“whitwho”+&+privateTrue+&+目标name+&+内容服务器 目标“privateTalk”+&+源name+&+目标name+&+内容3.2聊天室服务器端设计服务器包server主要包含两个类,分为ChatServer 和ClientProc3.2.1 ChatServer类该类包含了服务器的主要功能的实现:建立服务器连接,实现服务端用户登录、退出与监听,实现服务器端的消息收发,在线用户列表实现等主要功能。它的主要结构如下所示: 图3-1 3.2.2 Client
22、Proc类该类的功能是为某个用户服务的建立一个用户线程。主要的实现代码如下:private void updateList(String name, String sex) System.out.println(in two updatelist);ss.cl.remove(name);ss.resetcl();Ss.resetplist();public void run() while (name = null) try String inmsg;inmsg = in.readLine();System.out.println(inmsg);String userInfo;userInfo
23、 = inmsg.split(&);name = userInfo0;sex = userInfo1;ss.addConnection(s, this);if (ss.cl.contains(userInfo0) / 判断是否重名System.out.println(有重名错误);ss.sendERRO(name, samename);ss.deleteConnection(s, this, 1);s.close();return; else ss.sendOne(name, nosamename);System.out.println(没有重名错误!);System.out.println(
24、已将此用户记录);ss.sendAll(new& + inmsg); / 发送信息更新用户列表 new & name & sexSystem.out.println(已向所有用户发送 + name);ss.cl.add(name);System.out.println(用户列表: + ss.cl);ss.resetcl();ss.resetplist();Date t = new Date();ss.jTextArea1.append(t.toString() + :+ s.getInetAddress() + + s.getPort() + + name + 登入 + n);ss.flash
25、list();System.out.println(flashlist has run); catch (IOException ee) ee.printStackTrace();while (true) System.out.println(该用户线程开始监听信息);try String line = in.readLine();System.out.println(line);if (line.equals(quit)/ 处理退出事件(读取信息)ss.sendAll(【系统消息】 + this.name + 退出了聊天室);ss.deleteConnection(s, this);this
26、.updateList(this.name, this.sex);s.close();return; else/ 一般消息,又可以分为几种,对大家说, 与某个人交谈,传输文件信息或者私聊String inmsg = line.split(&);if (pareTo(cancelsendfile) = 0) / 取消文件发送消息ss.sendOne(inmsg1, cancelsendfile + & + this.name); else if (pareTo(sendfile) = 0)/ 发送文件消息ss.sendOne(inmsg1, sendfile + & + this.name +
27、&+ inmsg2 + & + inmsg3 + & + inmsg4+ & + inmsg5); else if (pareTo(acceptfile) = 0)/ 接收文件消息ss.sendOne(inmsg1, inmsg0 + & + this.name); else if (pareTo(refusefile) = 0)/ 拒绝接收文件消息ss.sendOne(inmsg1, inmsg0 + & + this.name); else if (!line.startsWith(withWho) / 对所有人说ss.sendAll(this.name + : + line);else
28、if (inmsg1.equals(privateTure) if (!(ss.sendOne(inmsg2, privateTalk + & + name+ & + inmsg2 + & + inmsg3) / 私聊不成功发送成功out.println(inmsg2 + 已经离开聊天室);out.flush(); else / 发给所有的人ss.sendAll(withWho + & + name + & + inmsg2+ & + inmsg3); catch (IOException e) System.out.println(e.toString();try s.close(); ca
29、tch (IOException e2) return;3.3聊天室客户端设计聊天室包chat主要包含五个类,分为ChatFrame 、Connect、Plist、PopupListener和Acceptfilethread&Sendfilethread。3.3.1 ChatFrame类该类是聊天室主要功能类,其中包括了聊天室界面设计,群聊私聊等功能的实现。其中数据包分析功能的主要代码如下:try if (inmsg = in.readLine() != null) if (inmsg.startsWith(samename) else if (inmsg.startsWith(somequi
30、t) String userInfo = inmsg.split(&);plist.listModel.removeElement(userInfo1 + + userInfo2 + ); else if (inmsg.startsWith(new)/ 接收服务器发送的更新用户列表信息System.out.println(inmsg + new);String userInfo = inmsg.split(&);if (userInfo1.equals(myName)insert(commonArea, 您 + 上线了);elseinsert(commonArea, userInfo1 + 上
31、线了); else if (inmsg.startsWith(resetselect) System.out.println(inmsg + new);String userInfo = inmsg.split(&);perponsComboBox.removeAllItems();perponsComboBox.addItem(所有人);for (int i = 1; i userInfo.length; i+) if (!(myName.equals(userInfoi) perponsComboBox.addItem(userInfoi); else if (inmsg.startsWi
32、th(resetplist) System.out.println(inmsg + new);String userInfo = inmsg.split(&);String cname;plist.listModel.removeAllElements();for (int i = 1; i userInfo.length; i+) System.out.println(userInfoi + + myName);cname = userInfoi.split( );if (!(cname0.equals(myName) plist.listModel.addElement(userInfoi
33、); else if (inmsg != null)/ 一般消息String sendfile = inmsg.split(&);if (pareTo(cancelsendfile) = 0) insert(myMsgArea, sendfile1 + 取消了文件发送);acceptboolean = false;this.acceptfile.setEnabled(true);this.acceptfileArea.setText(); else if (pareTo(sendfile) = 0) this.acceptfileArea.setText(sendfile2);insert(myMsgArea, sendfile1 + 发来文件);filemsg = inmsg; else if (pareTo(acceptfile) = 0) insert(myMsgArea, sendfile1 + 接收了你发的文件); else if (pareTo(refusefile) = 0) insert(myMsgArea, sendfile1 + 拒