简易版企业QQ聊天系统设计报告文档格式.docx
《简易版企业QQ聊天系统设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《简易版企业QQ聊天系统设计报告文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
1.客户端:
(1)新用户注册;
(2)用户登录验证;
(3)获取好友列表并显示好友状态(在线/不在线);
(4)添加用户好友;
(5)删除用户好友;
(6)用户与好友聊天(可查看聊天记录);
(7)接收系统信息。
2.服务端:
(1)启动和关闭后台服务器;
(2)查看客户端登录的相关信息(客户端登陆时间/登陆IP);
(3)向所有在线用户发送系统消息。
三、实验仪器和设备
硬件设备:
PC机
软件系统:
WinndowsServer2003、MicrosoftVisio2003、J2SE开发平台、SQLServer2008数据库。
四、总体设计
4.1系统的概述
简易版企业QQ聊天系统采用客户机/服务器(C/S)的模式来设计,是一个3层的C/S结构:
数据库服务器->
应用程序服务器端->
应用程序客户端。
系统采用C/S结构,可以将任务合理分配到客户机端和服务器端,从而降低了系统的通信开销,C/S体系结构如下图所示:
图1C/S体系结构
(1)客户层
客户层也叫应用层,是应用程序的用户接口部分。
给聊天工具设计一个客户层具有很多优点,这是因为客户层担负着用户与应用间的对话功能。
它用于检查用户的输入数据,显示应用的输出数据。
为了使用户能直观地进行操作,客户层需要合作图形用户接口。
若聊天用户变更,系统只需要改写显示控制和数据检查程序即可,而不影响其他两层。
数据检查的内容限于数据的形式和值的范围,不包括有关业务本身的处理逻辑。
(2)服务层
服务层也叫功能层,相当于应用的本体,它是将具体的业务处理逻辑编入程序中。
例如,用户需要检索数据,系统设法将有关检索要求的信息一次性地传送给功能层;
而用户登录后,聊天登录信息是由功能层处理过的检索结果数据,它也是一次性传送给表示层的。
在应用设计中,必须避免表示层和功能层之间进行多次的数据交换,这就需要尽可能进行一次性的业务处理,达到优化整体设计的目的。
(3)数据层
数据层就是DBMS,本系统使用了SQLServer2008数据库服务器来管理数据。
SQLServer能迅速执行大量数据的更新和检索。
因此,从功能层传送到数据层的“要求”一般都使用SQL语言。
4.2功能描述
简易版企业QQ聊天系统按如下过程完成通信:
(1)客户向服务器注册,告知服务器它在监听某主题;
(2)客户注册之后,向服务器发送消息;
(3)服务器再把消息发送给所有监听些主题的客户。
简易版企业QQ聊天系统由服务器端和客户端组成,要分析清楚两方面所要完成的任务,对设计来说,等于完成了一半。
根据聊天的通信步骤,该系统的功能模块如下图所示:
图2简易版企业QQ聊天系统功能模块图
1.服务器端
服务器完成5大功能:
建立连接、监听客户请求、操作数据库、查看用户登录消息和发送系统消息,这5大功能的具体含义如下:
建立连接:
系统启动时建立一个ServerSocket连接,绑定本地计算机的一个端口,不断侦听是否有客户端连接或者断开连接。
监听客户请求:
服务器端是一个信息的枢纽,所有客户端的信息都要传到服务器端,再由服务器根据要求分发出去,客户端在向服务器发送各种请求,如:
上线、隐身、获取我的好友、查找好友等等。
数据库操作:
当客户机向服务器发送请求时,服务器需要通过数据库管理软件对数据库的数据进行增、删和查询。
如录入用户信息、修改用户信息、查找好友数据库的资料以及添加好友数据到数据库等。
用户登录消息:
在服务器端的界面上,我们可以看到用户的登录消息,包括IP地址、端口号,登录时间等。
发送系统消息:
在客户端管理界面上,可以输入消息,并发送给所有的在线用户。
2.客户端
客户端完成3大功能:
用户管理、好友管理和聊天功能,这些功能的含义如下:
用户管理:
此功能又包括2个子功能,用户登录和用户注册。
客户端与服务器端建立通信通道,向服务器发送新建用户的信息,接收来自服务器听信息进行注册。
注册完毕后,可以通过系统的登录界面,输入账号和密码,然后发送到服务器进行验证。
如果验证通过,则打开程序的主界面。
好友管理:
此功能又包括3个子功能,查找好友、添加好友和删除好友。
在程序的主界面,提供查找好友的功能。
查找好友时,客户端向服务器发送查找好友请求,服务器端返回在线用户的信息,此时我们可以通过此来进行添加好友,并跟好友通过通信连接。
聊天功能:
客户端在与好友端建立通信连接后,便可以与好友进行聊天,聊天时发送的是文本信息,好友端在接收到聊天消息后,会提示收到消息,并由好友端自主打开消息接收界面。
所有的聊天消息都会被保存起来,可以查看与每个好友的聊天记录。
聊天记录包括内容和时间。
五、详细设计
5.1多线程设计
(1)服务器端的多线程
服务器需要和多个客户端同时进行通信,这就是服务器端的多线程。
一旦服务器发现一个新的客户端与之建立了连接,就马上新建一个线程与客户端进行通信。
用多线程的好处在于可以同时处理多个通信连接,不会出于由于数据排队而发生的延迟或者丢失,可以很好利用系统的性能。
服务器为每个连接着的客户建立一个线程,为了同时响应多个客户端,需设计一个主线程来启动服务器端的多线程。
主线程与进程结构类似,它在获得新连接时生成一个线程来处理这个这个连接。
线程调度速度快,占用资源少,可共享进程空间中的数据,因此服务器的响应速度较快,且I/O吞吐量较大。
在程序的代码里面,服务器端的多线程类定义为:
ClassServerThreadextendsThread{//略};
(2)客户端的多线程
客户端能够完成信息的接收和发送操作,这与服务器的多线程概念不同,可以采用循环等待的方法来实现客户端。
利用循环等待的方式,客户端首先接收用户输入的内容并将它们发送到服务器端,然后接收来自服务器端的信息,将其返回给客户端的用户。
在程序的代码里面,客户端的多线程定义为:
classMainWinextendsJFrameimplementsRunnable{//略};
5.2数据库设计
数据库表主要用来存放用户的注册信息和用户的好友资料,可利用两张数据表用来存放用户信息和用户好友资料。
在SQLServer2008上新建名为QQSystem的数据库,并建立两张数据库表:
用户的基本信息表(表名UserInformation)和用户好友数据库表(表名UserFriend).
1.UserInformation表
UserInformation表存放用户信息,信息。
利用SQLServer2008建立如下数据表:
表1用户信息表
字段
数据类型
说明
Ip
int
用户Ip
Id
char
用户的账号
name
用户的昵称
bit
用户ip
2.UserFriend表
UserFriend表的设计比较简单,本系统设计了用户的号码和好友的号码两个字段。
利用SQLServer2008建立如下数据表:
表2好友信息表
ip
id
好友的账号
5.3服务器设计
5.3.1主服务器类设计
主服务器实现了服务器的多线程,服务器端有一个进程(或多个进程)在指定的端口等待客户的连接信息。
一时连接成功,就可以按设计的数据交换方法和格式进行数据传输。
客户端只在需要的时候向服务端发出连接请求。
主服务器类调用ServerThread类,而每个ServerThread实体就是一个单独的线程,即对应于客户端连接请求响应的线程。
它的执行过程如下:
(1)使用ServerSockets=newServerSocket(8000)语句绑定8000端口创建套接口;
(2)使用Socket=s.accept()来监听用户的请求;
(3)使用newServerThread(socket)语句创建新的线程。
5.3.2.ServerThread类的设计
客户端发送连接请求的时候,服务器端创建一个ServerThread(socket)线程。
ServerThread类的函数执行过程可描述如下:
执行ServerThreadz(Sockets)线程构造函数;
执行socket=s取得传递参数;
BufferedReader(newInputStreamReader(socket.getInputStream()))创建输入流;
使用PrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOoutputStream)))创建输出流;
使用start()函数启动线程;
最后使用run()线程监听函数。
5.3.3.登录验证
(1)登录线程
如果客户端输入的字符串“login”,表示需要登录,那么服务器在接收到该信息后连接数据库,准备从数据库选择昵称和密码。
服务器接收到客户端发送过来的号码和密码信息后,设定数据库查寻条件,并执行数据库查寻,通过比较输入的用户名和密码和数据库信息来确定用户的登录是否成功,如果成功就,发送“ok”给客户端,通知其进入聊天主界面.反之发送“false”,提示用户登录失败。
登录流程如下图所示:
图3简易版企业QQ聊天系统登录流程图
(2)通知好友
通知好友也是在ServerThread类的run()函数里面,当某一用户成功登录后,发送“getwhoaddme”到服务器端,服务器端查找数据库中的“friend”数据表,并把用户的所有好友消息及在线状态发送回客户端,客户端通过这些好友的消息,向在线的好友发送上线通知。
5.3.4.新建用户
用户新建过程也在线程监听函数run()中。
当服务器端收到客户端发送的“new”请求时,服务器端开始进行新建用户操作。
新建用户的过程是这样的:
首先要使用权Class.forName方法加载数据库驱动类,该类的描述是sun.jdbc.odbc.JdbcOdbcDriver;
然后使用DriverManager.getConnection方法连接数据,数据库名为jdbc:
odbc:
javaicq;
最后服务器接收客户端用户发送的昵称、密码、用户E-mail,个人资料、籍贯和头像等信息,执行数据库添加操作完成用户的创建。
服务器为新建的用户指定唯一的注册号码,将以即时消息的方法发送给用户。
5.3.5.好友处理
(1)查找好友
当客户端向服务器查找好友的请求后,服务器立即响应并调Class.forName方法加载数据库驱动类sun.jdbc.odbc.JdbcOdbcDriver,然后调用方法DriverManager.getConnection完成数据库的连接,得到用户好友查询的结果。
查询结果包括:
好友的昵称、性别、性别、籍贯、个人资料等信息。
服务器对数据库听查询结果进行筛选,只向客户端的用户返回好友的注册号码、头像信息号以及是否在线信息。
客户端接收到查询结果后,利用相应的函数将其显示出来。
(2)添加好友
读取资料功能是在查找好友功能基础上建立的。
用户得到好友列表后,可根据需要读取好友的详细资料,也可读取用户自己的详细资料。
服务器使用Vector矢量保存客户端用户的好友号码,并返回好友的昵称、号码、IP地址、状态、头像和个人资料等信息。
(3)添加好友
服务器响应客户端用户的请求后,首先连接数据库,并根据接收的用户号码及好友号码向好友表添加记录。
服务器使用r6保存查询结果。
若r6为1,则表明添加好友成功,服务器将给客户端发出“okaddfriend”的消息;
否则添加好友失败,服务器将给客户端发出“falseaddfriend”的消息。
(4)添加好友应答
如果服务器收到其它用户添加我为好友的请求后,连接数据库,根据接收用户号码及好友号码向好友表添加记录。
若添加成功,则向用户传递好友的基本信息,比如昵称。
服务器利用r5保存处理结果,并向客户端输出结果。
(5)删除好友
当服务器接受到客户端删除好友请求后,它连接数据库,并根据接收的用户号码及好友号码表记录删除。
服务器利用r7保存删除结果,若r7为1,则删除成功,服务器给客户端发出“okdelfriend”的消息;
否则删除好友失败,服务器给客户端发出“falsedelfriend”的消息。
好友处理如下图所示:
图4好友处理请求图
5.3.6.退出下线
用户在线时,数据库表的IP地址字段为此时用户计算机的真实IP地址;
状态字段为1。
若用户退出下线,客户端向服务器端发送“logout”,服务器接收到下线请求时,需完成修改IP字段和状态字段。
服务器首先利用Class.forName方法加载数据库驱动类sun.jdbc.odbc.JdbcOdbcDriver;
然后通过方法DriverManager.getConnection连接数据库存;
最后根据用户号码,将其状态字段设为0,IP地址字段设为空。
5.4客户端设计
客户通过Socket与服务器建立连接。
服务器与客户都通过构造BufferedReader、PrintWriter来建立输入/输出流,双方通过该输入/输出流来相互传递信息。
一旦收到客户方的连接请求,服务器利用accept()函数返回一个新建的Socket对象,随后客户端向服务器发送消息,诸如注册、登录和查找好友等请求,服务器收到请求后,针对不同的消息处理请求。
在这一过程中,服务器端与客户端采用UDP协议通信。
虽然UDP协议不可靠,但对于聊天工具而言,其可靠性并不太重要。
5.4.1.用户注册
当服务器收到用户的注册请求后,开始接收客户传递的消息,诸如客户的昵称、性别、籍贯、头像和个人资料等信息。
接收完毕后,服务器便通过JdbcOdbc与后台数据库连接,向数据库添加记录。
若新用户注册,则向客户返回号码,并在数据库中注册用户的IP地址,设定Status值告知用户在线。
客户收到服务器返回的消息后,打开主程序窗口,同时创建UDP以便在用户之间建立联系。
注册通信过程如下图所示:
图5注册通信过程
5.4.2.用户登录
用户在客户端程序中输入用户号码与密码,与服务器建立连接,向服务器发送登录请求。
服务器收到该请求后,通过JdbcOdbc读取数据库,与用户输入的消息做比较:
若用户输入的信息与数据库信息相同,则服务器向客户返回成功消息,将其Status字段设为1,并注册用户当前的IP地址;
否则服务器向客户返回失败消息。
客户端收到服务器的成功确认后,打开聊天主窗口;
否则弹出失败信息。
客户端事件驱动与服务器端的事件监听相对应。
5.4.3.服务器连接
服务器连接是在ConnectServer()函数中实现的。
本函数用到了具有连接性、有序性特点的流,根据服务器的IP地址和端口来完成客户端与服务器的连接。
IP地址是网络中唯一地址的标识。
服务器连接过程分服务器端与客户端两部分,执行流程如下:
(1)服务器程序流程
●
程序初始化;
填写本机地址信息;
绑定并监听一个固定的端口;
收到Client的连接后建立一个Socket连接;
产生一个新的进程与Client进行通信和信息处理;
子通信结束后中断与Client的连接。
(2)客户端程序流程:
填写服务器地址消息;
连接服务器;
与服务器通信和信息处理;
●通信结束后断开连接。
六、主程序设计
用户完成登录后,客户端与服务器端建立连接。
连接建立成功后,客户向服务器请求读取好友名单;
服务器收到该请求,开始读取数据库中的friend表并得到好友的号码,再通过jcq表读取好友资料,向客户端发送这些信息;
客户收到服务器消息后,在主窗口显示好友。
客户端还建立矢量来存储好友的昵称、号码,头像编号和IP地址等信息。
登录界面及主界面如下图所示:
图6登录界面图
图7主界面图
6.1好友管理
好友查找可利用FindFriend2类完成,FindFriend2类继承自JFrame类。
FindFriend2中定义的界面控件包括:
好友的昵称、性别、住址、Jicq号码、IP地址、在线状态、头像、电子邮件和个人留言等信息。
a.用户添加好友是聊天工具的基本功能之一。
添加好友的基本步骤如下:
b.用户A登录后,向服务器发送查找请求,服务器响应并读取数据库表icq,将结果返回给用户;
c.用户在收到查询结果后选择用户B,向服务器发送添加好友请求,服务器收到请求响应,更新数据表frriend,并从icq表中读取好友基本信息,将信息返回给用户A;
d.用户A的客户端主窗口显示用户B,并通过UDP通知用户B;
e.用户B收到服务器的确认消息,可决定是否添加用户A为好友。
(3)删除好友
用户可以删除好友列表中指定的好友,客户端确认用户操作后向服务器发送删除请求,服务器收到该请求,连接数据库表friend并删除用户及该好友的记录。
若删除成功,则向客户端返回成功消息,通知用户。
6.2消息通信设计
消息的发送主要是通过数据报服务来实现的。
JAVA实现数据报通信的过程除面向连接的Socket外,还有无连接的数据报Socket。
数据报是网络层数据单元在介质上传输信息的逻辑分组格式,它是是一种在网络中传播的、独立的自身包含地址信息的消息,它能否到过目的地,到过的时间,到过内容是否变化是不能准确知道的。
数据报的通信双方不需要建立连接,对于像聊天通信这些不需要很高质量的应用程序来说,数据报通信是一个非常好的选择。
6.6.1发送消息
用户通过好友列表中好友的IP地址,利用UDP协议与其他用户进行信息交流。
消息发送之前先创建一个数据报文包,用来实现无连接的包传送服务。
每个数据报文包是用DatagramPacket类来创建的,DatagramPacket对象封装了数据报包数据、包长度、目标地址和目标端口。
若客户端发送数据包,则构造函数创建DatagramPacket对象,将需要发送的数据和包文目的地址信息放入对象之中。
在发送的过程中利用构造函数DatagramPacket(bytebufferedarray[],intlength,InetAddressaddress,intport)构造一个包长度为length的包,它是将数据传送到指定端口号上的数据包,参数length必须小于等于bufferedarry.length.消息发送是通过调用DatagramPacket对象中有send方法实现的,它需要以DatagramPacket对象为参数,将刚才封装进DatagramPacket对象中的数据组成数据报发出。
发送消息流程如下图所示:
图8发送消息流程图
6.6.2监听好友的消息
为了监听好友的消息,系统首先定义一个数组,该数组用于接收用户消息中的数据;
然后创建数据报,使用receiveSocket.recerive(receivePacket)函数等待并接收数据报,取得数据报中的数据。
监听好友消息的流程如下图所示:
图9监听好友消息流程图
(1)当接收好友消息时,主程序弹出一个对话框,由用户自行选择接收信息与否,用户可根据消息提示,打开相应好友的接收消息对话框来接收消息。
接收消息的流程如下图所示:
图10接收消息流程图
(2)上线和隐身
当用户想处于非聊天状态的时候,可以切换至隐身状态。
这时候,用户的客户端会查找所有在线的好友,并发制作数据包,发送“隐身”要求给所有好友的客户端。
在好友的程序界面上,用户的头像由彩色变成黑白。
此时,所有好友都无法发送消息给此用户。
当用户想点击程序界面的“上线”按钮时,既可通知所有的好友此用户上线了。
好友聊天界面如下图所示:
图11聊天界面图
七、心得体会
在学习中老师不肯能把所有的东西都教会你,在学校中老师只是大概提了一些的东西甚至一点都没有提到的知识在做项目的时候却用到了。
就需要我们快速提高学习能力和接受能力,并且把所学到的东西快速的运用到实践中去。
实践,就是把我们在学校所学到的理论知识,运用到客观实际中去,使自己所学的理论知识有用武之地。
只学习不实践,那么所学就等于零。
理论应该与实践相结合。
而另一方面,实践可以为以后找工作打下基础。
通过这段时间的实习,我学到了一些在课堂上学不到的东西。
因为在这里身处的环境不同,所接触的人与事也不相同,从中学到的东西自然就不一样了。
要学会在实践中学习,从学习中实践。
在做项目的时候得学会和小组成员交流沟通,相互帮助并发现彼此的问题,团队精神在尤其是做项目最后的时候得以体现。
首先,团队合作最基本的技能就是沟通。
沟通的目的就是让别人了解你的想法,因为每个人考虑问题的时候总会有各种各样的偏差,我们只有沟通很好的沟通来综合所有人的好的想法,以减少走弯路,而让事情进行的更顺利。
其次,任务是否明确,影响开发效