多人聊天系统的设计与实现.docx
简洁谈天程序的设计与实现摘要本课程设计主要是设计并实现一个简洁的谈天程序,该谈天程序能够支持多人聊 天,谈天的内容可以仅仅支持文本信息,谈天程序包括效劳器程序和客户端程序。在课程设计中系统的开发平台为 Eclipse 程序运行平台为 Windows XP。关键词:谈天程序;效劳器;客户端;Eclipse1 引 言本课程设计主要是简洁谈天程序的设计,使用 MSN 或 QQ,分析谈天程序的功能需求及工作原理。该谈天程序能够支持多人谈天,谈天的内容可以仅仅支持文本信息, 谈天程序包括效劳器程序和客户端程序。1.1 课程设计目的该课程设计的目的主要是通过对简洁谈天程序的设计及 QQ 原理的分析,了解谈天程序的功能需求及工作原理;生疏TCP/IP 协议以及套节字编程原理;生疏Eclipse 编程环境及 Socket/ServerSocket 编程方法。1.2 课程设计要求(1) 按要求编写课程设计报告书,能正确阐述设计结果。(2) 通过课程设计培育学生严谨的科学态度,认真的工作作风和团队协作精神。(3) 学会文献检索的根本方法和综合运用文献的力量。(4) 在教师的指导下,要求每个学生独立完成课程设计的全部内容。1.3 课程设计平台课程设计中系统的开发平台为 Eclipse,程序运行平台为 Windows XP。2 需 求 分 析2.1 功能需求分析(1) 用户端之间的信息发送,本程序需要实现的最根本的功能。用户在界面上可以将自己需要发送的信息填入相应的对话框中,点击发送按钮后,可以将信息正常的发送给相应的其它用户,这个过程中的客户端与客户端之间使用点对点发送信息,估量利用 TCP/IP 协议中的 UDP 协议,在本程序中共需要 3 个端口,此功能估量使用 3 号端口。(2) 在线用户主机 IP 列表的维护。在用户发送信息之前,需要选择相应的目的地端 IP,这也就需要客户端拥有在线用户主机的 IP 地址,这个在线主机列表的维护是需要客户端定时自动向效劳器端发送信息,效劳器端收集并维护在线用户列表,再发送回客户端。需要在客户端和效劳器端都使用定时器来完成此功能。此功能估量使用 1 、2号端口。(3) 在 C/S 模式中,效劳器与客户端是相互依靠的。在客户端启用以后,需要查看效劳器端是否在线,效劳器在线才能正常使用客户端,假设效劳器不在线,则在检测肯定次数以后自动退出客户端程序。在使用过程中,客户端在指定时间内未向效劳器端发送信息的,效劳器认为客户端下线;客户端在肯定时间内未收到效劳器端信息的,认为效劳器已经下线,则提示用户并建议退出,在用户肯定时间后没有退出的则自动关闭客户端程序1。2.2 数据需求分析(1) 客户端之间谈天信息。在控件上显示时格式化,更易于用户的查看自己发送或接收到的信息。(2) 在线用户谈天信息。效劳器端存放在适当的空间中,在发送给客户端时,对信息列表进展格式化,便于客户端提取信息。(3) 客户端向效劳器端发送确实认在线信息。包括客户端刚刚启动时的初始化信息和在使用过程中确实认在线信息。(4) 其它程序内部可能需要设计的数据构造体。2.3 性能需求分析1牢靠性高,能在由于系统问题或其它缘由产生错误后,作出相对应处理,比方网络初始化失败、效劳器不在线等,可以提示用户安全退出本程序,在消灭不行知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的大事,并能在推断大事后做出相应的处理,使程序具有较高的容错性能2。2宜操作性,程序简洁易懂,简洁上手使用。设计界面是,简化界面的简单性,模拟 QQ 等现有即时通讯工具的界面,使用户能很简洁看懂并使用。(3) 开发文档易理解,保证以后自己二次开发或他人接手开发时,能够清楚的理解整个系统的设计思路和实现细节。(4) 模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更便利于在工作中的应用。2.4 运行需求分析(1) 用户界面程序较小,启动速度快。可在网络中使用,有注册功能,需进展用户登录。启动后的应用界面要清爽,设计要简洁明白,要具有较高的易用性。(2) 故障处理在遇到可预知的故障与状况时,能提示用户并自动退出;在遇到不行预知的故障时能安全退出。3 设 计 原 理3.1 谈天程序的工作原理QQ 谈天程序承受的是 C/S 通信模式,即客户/效劳模式,它把一个应用划分成功能不同的两个局部,分别在不同的计算机上运行,其中一个为效劳端程序,用来响应和供给固定的效劳,一个为客户端程序,用来向效劳端提出恳求和要求某种效劳。在数量关系上,通常有一对一的即一个效劳端程序和一个客户端程序之间通信,也有一对多的即一个效劳端程序和多个客户端程序之间通信,也有多对多的即多个效劳端程序和多个客户端程序之间通信。所谓效劳端程序、客户端程序也是相对的概念,有时在一个程序中既有效劳端又有客户端的功能。QQ 谈天程序分成了两个程序,一个安装在腾讯公司的效劳器上,我们称之为效劳端程序,一个安装在QQ 用户的计算机上,我们称之为客户端程序。在很多介绍网络通信编程的书籍中有关网络谈天的例子,当一个客户要与另一个客户谈天时,第一个客户先把谈天数据发送给效劳器,然后效劳器再把谈天数据转发给其次个客户,效劳器似乎一个中转站,这在客户数量比较少时,效劳器还能承受,在客户数量比较多时,效劳器确定要瘫痪。何况客户之间还要传送文件、语音谈天、视频谈天等等,为了削减效劳器的压力,各客户端之间需要直接通信。(1) 在效劳端和客户端之间(一对多)用于客户端程序登录,验证用户密码,猎取其它在线好友信息等等。(2) 在客户端和客户端之间(多对多)用于在线好友间直接通信谈天。此时每个客户端程序上既有实现效劳端功能的局部,又有实现客户端功能的局部,前者用于接收谈天数据,后者用于发送谈天数据。在用 C/S 模式进展通信时,作为客户端在恳求与效劳端连接时需要知道效劳端的 IP 地址,腾讯公司的效劳器具有固定的公网地址,这没有问题。但是在客户端和客户端之间通信时,每个用户的 IP 地址都是 ISP 所给的临时地址,无法固定,那么某个用户要与另一个用户连接时,怎么知道对方的 IP 地址呢?当一个用户连接到 Internet 后,获得了一个临时的公网地址,当登录到QQ 时,QQ 效劳端会获得该上线用户的 IP 地址,然后告知其他要与该上线用户谈天的用户,其他用户就可以连接该用户与之直接通信了。在 Win32 平台上,对于众多的基层网络协议,Winsock 是访问它们的首选接口。如果想从头开发一个网络通信应用程序,TCP/IP 就是首选协议之一。为了保证牢靠的数据传输,宜选择 TCP 协议3。3.2 TCP/IP 协议TCP/IPTransmission Control Protocol/Internet Protocol)的简写,中文译名为传输掌握协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet 最根本的协议、Internet 国际互联网络的根底,简洁地说,就是由网络层的 IP 协议和传输层的TCP 协议组成的。网际协议 IP 是 TCP/IP 的心脏,也是网络层中最重要的协议。IP 层接收由更低层网络接口层例如以太网设备驱动程序发来的数据包,并把该数据包发送到更高层-TCP 或 UDP 层;相反,IP 层也把从 TCP 或 UDP 层接收来的数据包传送到更低层。IP 数据包是不行靠的,由于 IP 并没有做任何事情来确认数据包是按挨次发送的或者没有被破坏。IP 数据包中含有发送它的主机的地址源地址和接收它的主机的地址目的地址。高层的 TCP 和 UDP 效劳在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP 地址形成了很多效劳的认证根底,这些效劳信任数据包是从一个有效的主机发送来的。IP 确认包含一个选项,叫作 IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些 TCP 和 UDP 的效劳来说,使用了该选项的 IP 包似乎是从路径上的最终一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明白它可以被用来哄骗系统来进展寻常是被制止的连接。那么, 很多依靠 IP 源地址做确认的效劳将产生问题并且会被非法入侵4。假设 IP 数据包中有已经封好的 TCP 数据包,那么 IP 将把它们向上传送到 TCP 层。TCP 将包排序并进展错误检查,同时实现虚电路间的连接。TCP 数据包中包括序号和确认,所以未依据挨次收到的包可以被排序,而损坏的包可以被重传。TCP 将它的信息送到更高层的应用程序,例如 Telnet 的效劳程序和客户程序。应用程序轮番将信息送回 TCP 层,TCP 层便将它们向下传送到 IP 层,设备驱动程序和物理介质,最终到接收方。面对连接的效劳例如 Telnet、FTP、rlogin、X Windows 和 SMTP需要高度的牢靠性,所以它们使用了 TCP。DNS 在某些状况下使用 TCP发送和接收域名数据库,但使用 UDP 传送有关单个主机的信息。3.3 套接字编程原理在 TCP/IP 网络中两个进程间的相互作用的主机模式是客户机/ 效劳器模式(Client/Server model)。该模式的建立基于以下两点: 1、非对等作用;2、通信完全是异步的。客户机/效劳器模式在操作过程中实行的是主动请示方式:首先效劳器方要先启动,并依据请示供给相应效劳:过程如下(1) 翻开一通信通道并告知本地主机,它情愿在某一个公认地址上接收客户恳求。(2) 等待客户恳求到达该端口。(3) 接收到重复效劳恳求,处理该恳求并发送应答信号。(4) 返回其次步,等待另一客户恳求(5) 关闭效劳器。客户方:(1) 翻开一通信通道,并连接到效劳器所在主机的特定端口。(2) 向效劳器发送效劳恳求报文,等待并接收应答;连续提出恳求(3) 恳求完毕后关闭通信通道并终止。所谓的客户客户端/效劳器。是一种能够在基于网络环境的分布处理过程中,使用基于连接的网络通信模型。该通信模型首先在客户机和效劳器之间定义一套通信协议,并创立一个 Socket 类,利用这个类来建立一条牢靠的链接;然后,客户端/效劳器再在这条连接上牢靠地传输数据。客户端发出恳求,效劳器发出恳求,效劳器监听来自客户机的恳求,并为客户端供给相应效劳。利用 Socket 类,我们可以轻松地实现网路客户端程序的编写,Socket 类的一些常用的方法汇总如下:getLocalAddress读取套接字对象的本地地址。getLocalPort读取套接字所使用的本地端口号。getlnputStream 得到一个输入流。getOutputStream 得到一个输出流。通常状况下,客户端只要能够挨次地处理效劳器程序的响应就可以了,因此客户端程序通常不用使用多线程。3.4 Eclipse 开发环境Eclipse 最初是由IBM 公司开发的替代商业软件Visual Age for Java的下一代IDE 开发环境,是著名的跨平台的自由集成开发环境。最初主要用来 Java 语言开发,但是目前亦有人通过插件使其作为其他计算机语言比方 C+和 Python 的开发工具。Eclipse 的本身只是一个框架平台,但是众多插件的支持使得 Eclipse 拥有其他功能相对固定的 IDE 软件很难具有的敏捷性。很多软件开发商以 Eclipse 为框架开发自己的IDE。Eclipse 承受的技术是 IBM 公司开发的SWT,这是一种基于 Java 的窗口组件,类似 Java 本身供给的 AWT 和 Swing 窗口组件;不过 IBM 声称 SWT 比其他 Java 窗口组件更有效率。Eclipse 的用户界面还使用了 GUI 中间层 JFace,从而简化了基于 SWT 的应用程序的构建。Eclipse 的插件机制是轻型软件组件化架构。在富客户机平台上,Eclipse 使用插件来供给全部的附加功能,例如支持 Java 以外的其他语言。 已有的分别的插件已经能够支持 C/C+CDT、Perl、Ruby,Python、telnet 和数据库开发。插件架构能够支持将任意的扩展参加到现有环境中,例如配置治理,而决不仅仅限于支持各种编程语言。Eclipse 的设计思想是:一切皆插件。Eclipse 核心很小,其它全部功能都以插件的形式附加于 Eclipse 核心之上。Eclipse 根本内核包括:图形 API (SWT/Jface), Java 开发环境插件JDT,插件开发环境PDE等5。4 设 计 步 骤4.1 谈天室的总体设计谈天室的总体设计过程比较简洁主要是构建设计框图。,就是当客户端发出信息时, 我们将数据写到 socket,当对方有数据到达时,我们从socket 读出来并显示给客户。程序关键在于如何监听到有信息到达的过程。应用程序流程图如以下图所示,开头是先创立主窗口,然后初始化窗口,程序下面才开头消息循环处理。假设没有消息循环的活,直接完毕掉这个程序。假设有循环的话,要推断这个窗口消息的内容是哪种类型,然后再进展选择处理方式。然后依据不同的内容选择“创立控件”,还是要“推断命令”,或是分别处理各种 socket 的消息。流程图如图 4-1 所示开头创立窗口初始化完毕NO完毕处理连续消息循环YesCREAT创立控件推断窗口消息 SOCKETCOMMAN连接推断命令侦听Bind分别处理各种Socket消息connectListen图 4-1 谈天室设计架构图4.2 谈天室的模块谈天室主要包括三个模块,效劳器模块、客户端模块、信息处理模块。该谈天室可以支持多人谈天,只支持文本信息。(1) 效劳器模块其所包含的函数模块如以下图所示(2) 客户端模块图 4-2 效劳器模块图客户端所包含的函数模块如以下图所示(3) 信息处理模块图 4-3 客户端模块图信息处理模块包括注册信息及登录信息的处理模块,其所包含的函数模块如以下图所示图 4-4 信息处理模块图4.3 程序的调试谈天室的程序模块如以下图所示图 4-5 谈天室程序模块图程序运行后,用户注册界面如以下图所示图 4-6 用户注册界面用户登录界面如以下图所示图 4-7 用户登录界面进入谈天室的谈天界面如以下图所示图 4-8 谈天室界面可以进展多人谈天,多人谈天如以下图所示图 4-9 多人谈天5 问 题 分 析首先是对 QQ 软件的需求分析还有工作原理的生疏,虽然平日用的已经很娴熟了, 但原理方面的学问还是有点模糊,通过对资料的学习及一些小程序的运行,谈天方面的原理才渐渐清楚。由于之前没有学过 Java,所以对 Eclipse 编程环境几乎是一无所知,在程序编译过程中遇到的问题比较多,主要是对那些错误还有警告开头都不知道什么意思,花了两天的时间在程序的调试上面。另外就是一些概念性的学问欠缺,尤其是套接字编程原理, 所以对程序的一些函数的功能用法有些模糊。其实遇到的种种问题主要是两方面的缘由。一个是根底学问的把握不够结实,概念的混淆,不能够很快的用最正确的方式去解决遇到的问题等等,都是由于学问的不娴熟导致。另一个就是 Java 局部学问的缺乏,导入文件还有一些参数的选择都要查询一下资料,主要是第一次操作这方面的学问。针对这些问题,主要从两个方面着手处理应当, 一方面是多对所学过的学问强化温习,做到熟能生巧,温故知。另一方面就是预备的不够充分,之前应当及早的对所需软件进展生疏,在以后的实习过程中需要留意。6 总 结网络的课程设计,之前没有接触过网络编程的语言,所以感觉难度比较大,也由于如此,在找资料及向教师同学的请教中学到了很多的东西。这次的课程设计是简洁谈天程序,在平日的生活学习中,可以说QQ 等即时通讯软件已占据重要的位置,也深受大家的宠爱,所以这个课程设计很有现实意义,做起来也比较感兴趣。在具体做的过程中,参考了网络班同学还有学长的一些程序,虽然这个谈天室的界面及功能比较简洁,但从代码的编写及结果的调试成功还是花了很多的心思。尤其是刚开头用 Eclipse 软件的时候,从完全生疏到渐渐的了解,这其中的过程对应用方面学问的提高有很大的帮助。课程设计工程的虽然要求是独立完成,但还是很多问题的解决离不开教师的指导及同学之间的探讨,这些在做工程的时候都是必不行少的。学校供给了设计的机房还有教师的悉心指导,这些跟课程设计的顺当完成都是密不行分的,在这里感谢大家带来的帮助。另外就是学问方面的问题,计算机网络和 Java Socket 有很多方面的学问还是很不生疏,具体用到的时候就感觉生疏,或者还是缺乏设计方面的实践。课程设计的时机不是很多,由于所学的学问包含了太多的方面,所以实践方面还是远远不够,期望在学校期间能够多一些类似的时机。虽然课程设计顺当的完成了,但由于水平有限,还是有很多的欠缺跟缺乏之处,期望教师赐予指正。参考文献1 谢希仁. 计算机网络. 北京:电子工业出版社,20232 Y.Daniel Liang. Java 语言程序设计. 北京:机械工业出版社,20233 赛奎春. JSP 工程应用与工程实践. 北京:机械工业出版社,20234 Ian F.Darwin. Java 经典实例. 北京:中国电力出版社,19995 丁振凡. Java 语言有用教程. 北京:北京邮电大学出版社,2023附录 1:效劳器程序清单/ ChatService.java package lee; import java.util.*; import java.io.*;public class ChatServiceprivate static ChatService cs; private Properties userList;private LinkedList<String> chatMsg; private ChatServicepublic static ChatService instanceif (cs = null)cs = new ChatService;return cs;public boolean validLogin(String user , String pass) throws IOExceptionif (loadUser.getProperty(user) = null)return false;if (loadUser.getProperty(user).equals(pass)return true;return false;public boolean addUser(String name , String pass) throws Exceptionif (userList = null)userList = loadUser;if (userList.containsKey(name)throw new Exception(“用户名已经存在,请重选择用户名“);userList.setProperty(name , pass); saveUserList;return true;public String getMsgif (chatMsg = null)chatMsg = new LinkedList<String> return “;String result = “;for (String tmp : chatMsg)result += tmp + “n“;return result;public void addMsg(String user , String msg)if (chatMsg = null)chatMsg = new LinkedList<String>if (chatMsg.size > 40)chatMsg.removeFirst;chatMsg .add(user + “说:“ + msg);/下面是系统的工具方法/ private Properties loadUserthrows IOExceptionif (userList = null)File f = new File(“userFile.properties“); if (!f.exists)f.createNewFile ; userList = new Properties;userList.load(new FileInputStream(f);return userList;private boolean saveUserListthrows IOExceptionif (userList = null)return false;userList.store(new FileOutputStream(“userFile.properties“), “userList“); return true;附录 2:客户端程序清单/ChatServlet.java package lee;import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.servlet. . Servlet;import javax.servlet. . ServletRequest; import javax.servlet. . ServletResponse; import javax.servlet.ServletException;import javax.servlet.ServletContext; import javax.servlet.RequestDispatcher; import javax.servlet. . Servlet;import javax.servlet. . ServletRequest; import javax.servlet. . ServletResponse;import java.io.PrintWriter; import java.io.IOException;public class ChatServlet extends Servlet /* Constructor of the object.*/public ChatServlet super;/* Destruction of the servlet. <br>*/public void destroy super.destroy; / Just puts “destroy“ string in log/ Put your code here/* The doGet method of the servlet. <br>* This method is called when a form has its tag value method equals to get.* param request the request send by the client to the server* param response the response send by the server to the client* throws ServletException if an error occurred* throws IOException if an error occurred*/public void doGet( ServletRequest request, ServletResponse response) throws ServletException, IOException /* The doPost method of the servlet. <br>* This method is called when a form has its tag value method equals to post.* param request the request send by the client to the server* param response the response send by the server to the client* throws ServletException if an error occurred* throws IOException if an error occurred*/public void doPost( ServletRequest request, ServletResponse response) throws ServletException, IOException /* Initialization of the servlet. <br>* throws ServletException if an error occurs*/public void init throws ServletException / Put your code herepublic void service( ServletRequest request, ServletResponse response) throws IOException,ServletExceptionrequest.setCharacterEncoding(“UTF-8“); String msg = request.getParameter(“chatMsg“); if ( msg != null && !msg.equals(“)String user = (String)request.getSession(true).getAttribute(“user“); ChatService.instance.addMsg(user , msg);/设置中文流response.setContentType(“text/html;charset=GBK“);PrintWriter out =response.getWriter; out.println(ChatService.instance.getMsg);