多人聊天系统的设计与实现毕业设计论文.docx
《多人聊天系统的设计与实现毕业设计论文.docx》由会员分享,可在线阅读,更多相关《多人聊天系统的设计与实现毕业设计论文.docx(18页珍藏版)》请在冰豆网上搜索。
![多人聊天系统的设计与实现毕业设计论文.docx](https://file1.bdocx.com/fileroot1/2023-1/28/3f6834ba-30ca-4e66-a0b1-72e73cfd84a5/3f6834ba-30ca-4e66-a0b1-72e73cfd84a51.gif)
多人聊天系统的设计与实现毕业设计论文
简单聊天程序的设计与实现
摘要
本课程设计主要是设计并实现一个简单的聊天程序,该聊天程序能够支持多人聊天,聊天的内容可以仅仅支持文本信息,聊天程序包括服务器程序和客户端程序。
在课程设计中系统的开发平台为Eclipse程序运行平台为WindowsXP。
关键词:
聊天程序;服务器;客户端;Eclipse
1引言
本课程设计主要是简单聊天程序的设计,使用MSN或QQ,分析聊天程序的功能需求及工作原理。
该聊天程序能够支持多人聊天,聊天的内容可以仅仅支持文本信息,聊天程序包括服务器程序和客户端程序。
1.1课程设计目的
该课程设计的目的主要是通过对简单聊天程序的设计及QQ原理的分析,了解聊天程序的功能需求及工作原理;熟悉TCP/IP协议以及套节字编程原理;熟悉Eclipse编程环境及Socket/ServerSocket编程方法。
1.2课程设计要求
(1)按要求编写课程设计报告书,能正确阐述设计结果。
(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。
(3)学会文献检索的基本方法和综合运用文献的能力。
(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。
1.3课程设计平台
课程设计中系统的开发平台为Eclipse,程序运行平台为WindowsXP。
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.2TCP/IP协议
TCP/IP(TransmissionControlProtocol/InternetProtocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。
IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。
IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。
IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。
也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。
IP确认包含一个选项,叫作IPsourcerouting,可以用来指定一条源地址和目的地址之间的直接路径。
对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。
这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。
那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵[4]。
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。
TCP将包排序并进行错误检查,同时实现虚电路间的连接。
TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。
应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。
面向连接的服务(例如Telnet、FTP、rlogin、XWindows和SMTP)需要高度的可靠性,所以它们使用了TCP。
DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。
3.3套接字编程原理
在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Servermodel)。
该模式的建立基于以下两点:
1、非对等作用;2、通信完全是异步的。
客户机/服务器模式在操作过程中采取的是主动请示方式:
首先服务器方要先启动,并根据请示提供相应服务:
(过程如下)
(1)打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。
(2)等待客户请求到达该端口。
(3)接收到重复服务请求,处理该请求并发送应答信号。
(4)返回第二步,等待另一客户请求
(5)关闭服务器。
客户方:
(1)打开一通信通道,并连接到服务器所在主机的特定端口。
(2)向服务器发送服务请求报文,等待并接收应答;继续提出请求……
(3)请求结束后关闭通信通道并终止。
所谓的客户客户端/服务器。
是一种能够在基于网络环境的分布处理过程中,使用基于连接的网络通信模型。
该通信模型首先在客户机和服务器之间定义一套通信协议,并创建一个Socket类,利用这个类来建立一条可靠的链接;然后,客户端/服务器再在这条连接上可靠地传输数据。
客户端发出请求,服务器发出请求,服务器监听来自客户机的请求,并为客户端提供相应服务。
利用Socket类,我们可以轻松地实现网路客户端程序的编写,Socket类的一些常用的方法汇总如下:
getLocalAddress()
读取套接字对象的本地地址。
getLocalPort()
读取套接字所使用的本地端口号。
getlnputStream()
得到一个输入流。
getOutputStream()
得到一个输出流。
通常情况下,客户端只要能够顺序地处理服务器程序的响应就可以了,因此客户端程序通常不用使用多线程。
3.4Eclipse开发环境
Eclipse最初是由IBM公司开发的替代商业软件VisualAgeforJava的下一代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所示
图4-1聊天室设计架构图
4.2聊天室的模块
聊天室主要包括三个模块,服务器模块、客户端模块、信息处理模块。
该聊天室可以支持多人聊天,只支持文本信息。
(1)服务器模块
其所包含的函数模块如下图所示
图4-2服务器模块图
(2)客户端模块
客户端所包含的函数模块如下图所示
图4-3客户端模块图
(3)信息处理模块
信息处理模块包括注册信息及登录信息的处理模块,其所包含的函数模块如下图所示
图4-4信息处理模块图
4.3程序的调试
聊天室的程序模块如下图所示
图4-5聊天室程序模块图
程序运行后,用户注册界面如下图所示
图4-6用户注册界面
用户登录界面如下图所示
图4-7用户登录界面
进入聊天室的聊天界面如下图所示
图4-8聊天室界面
可以进行多人聊天,多人聊天如下图所示
图4-9多人聊天
5问题分析
首先是对QQ软件的需求分析还有工作原理的熟悉,虽然平日用的已经很熟练了,但原理方面的知识还是有点模糊,通过对资料的学习及一些小程序的运行,聊天方面的原理才渐渐清晰。
由于之前没有学过Java,所以对Eclipse编程环境几乎是一无所知,在程序编译过程中遇到的问题比较多,主要是对那些错误还有警告开始都不知道什么意思,花了两天的时间在程序的调试上面。
另外就是一些概念性的知识欠缺,尤其是套接字编程原理,所以对程序的一些函数的功能用法有些模糊。
其实遇到的种种问题主要是两方面的原因。
一个是基础知识的掌握不够牢固,概念的混淆,不能够很快的用最佳的方式去解决遇到的问题等等,都是由于知识的不熟练导致。
另一个就是Java部分知识的缺乏,导入文件还有一些参数的选择都要查询一下资料,主要是第一次操作这方面的知识。
针对这些问题,主要从两个方面着手处理应该,一方面是多对所学过的知识强化温习,做到熟能生巧,温故知新。
另一方面就是准备的不够充分,之前应该及早的对所需软件进行熟悉,在以后的实习过程中需要注意。
6总结
网络的课程设计,之前没有接触过网络编程的语言,所以感觉难度比较大,也因为如此,在找资料及向老师同学的请教中学到了很多的东西。
这次的课程设计是简单聊天程序,在平日的生活学习中,可以说QQ等即时通讯软件已占据重要的位置,也深受大家的喜爱,所以这个课程设计很有现实意义,做起来也比较感兴趣。
在具体做的过程中,参考了网络班同学还有学长的一些程序,虽然这个聊天室的界面及功能比较简单,但从代码的编写及结果的调试成功还是花了很多的心思。
尤其是刚开始用Eclipse软件的时候,从完全陌生到慢慢的了解,这其中的过程对应用方面知识的提高有很大的帮助。
课程设计项目的虽然要求是独立完成,但还是很多问题的解决离不开老师的指导及同学之间的探讨,这些在做项目的时候都是必不可少的。
学校提供了设计的机房还有老师的悉心指导,这些跟课程设计的顺利完成都是密不可分的,在这里感谢大家带来的帮助。
另外就是知识方面的问题,计算机网络和JavaSocket有很多方面的知识还是很不熟悉,具体用到的时候就感觉生疏,或者还是缺乏设计方面的实践。
课程设计的机会不是很多,由于所学的知识包含了太多的方面,所以实践方面还是远远不够,希望在学校期间能够多一些类似的机会。
虽然课程设计顺利的完成了,但由于水平有限,还是有很多的欠缺跟不足之处,希望老师给予指正。
参考文献
[1]谢希仁.计算机网络.北京:
电子工业出版社,2009
[2]Y.DanielLiang.Java语言程序设计.北京:
机械工业出版社,2008
[3]赛奎春.JSP工程应用与项目实践.北京:
机械工业出版社,2005
[4]IanF.Darwin.Java经典实例.北京:
中国电力出版社,1999
[5]丁振凡.Java语言实用教程.北京:
北京邮电大学出版社,2005
附录1:
服务器程序清单
//ChatService.java
packagelee;
importjava.util.*;
importjava.io.*;
publicclassChatService
{
privatestaticChatServicecs;
privatePropertiesuserList;
privateLinkedListchatMsg;
privateChatService()
{
}
publicstaticChatServiceinstance()
{
if(cs==null)
{
cs=newChatService();
}
returncs;
}
publicbooleanvalidLogin(Stringuser,Stringpass)
throwsIOException
{
if(loadUser().getProperty(user)==null)
{
returnfalse;
}
if(loadUser().getProperty(user).equals(pass))
{
returntrue;
}
returnfalse;
}
publicbooleanaddUser(Stringname,Stringpass)
throwsException
{
if(userList==null)
{
userList=loadUser();
}
if(userList.containsKey(name))
{
thrownewException("用户名已经存在,请重新选择用户名");
}
userList.setProperty(name,pass);
saveUserList();
returntrue;
}
publicStringgetMsg()
{
if(chatMsg==null)
{
chatMsg=newLinkedList();
return"";
}
Stringresult="";
for(Stringtmp:
chatMsg)
{
result+=tmp+"\n";
}
returnresult;
}
publicvoidaddMsg(Stringuser,Stringmsg)
{
if(chatMsg==null)
{
chatMsg=newLinkedList();
}
if(chatMsg.size()>40)
{
chatMsg.removeFirst();
}
chatMsg.add(user+"说:
"+msg);
}
//////////////////////////////////////////////////////////////
//下面是系统的工具方法
/////////////////////////////////////////////////////////////
privatePropertiesloadUser()throwsIOException
{
if(userList==null)
{
Filef=newFile("userFile.properties");
if(!
f.exists())
f.createNewFile();
userList=newProperties();
userList.load(newFileInputStream(f));
}
returnuserList;
}
privatebooleansaveUserList()throwsIOException
{
if(userList==null)
{
returnfalse;
}
userList.store(newFileOutputStream("userFile.properties"),"userList");
returntrue;
}
}
附录2:
客户端程序清单
//ChatServlet.java
packagelee;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.ServletException;
importjavax.servlet.ServletContext;
importjavax.servlet.RequestDispatcher;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.PrintWriter;
importjava.io.IOException;
publicclassChatServletextendsHttpServlet{
/**
*Constructoroftheobject.
*/
publicChatServlet(){
super();
}
/**
*Destructionoftheservlet.
*/
publicvoiddestroy(){
super.destroy();//Justputs"destroy"stringinlog