java大作业设计报告JAVA聊天室Word文档格式.docx
《java大作业设计报告JAVA聊天室Word文档格式.docx》由会员分享,可在线阅读,更多相关《java大作业设计报告JAVA聊天室Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
GUI,注册,登陆,聊天等。
用例图:
4概要设计
服务器设计
将客户端的请求抽象化,每种请求服务器都会产生一个特定的类的对象去处理它。
服务器负责接受客户端请求,根据请求内容完成指定工作。
为提高效率,采用多线程结合线程池设计技术,对于每个请求在线程池内得到一个线程去处理请求。
如图3-1所示。
客户端设计
5
聊天室中一个事物的过程基本流程是:
用户产生动作,客户端发送消息,服务器接收并处理,服务器返回处理结果,GUI根据结果进行显示的更新。
客户端只在GUI中采用多线程设计。
而对服务器回应的接受都是单线程的因为只有一个服务器为自己服务,且在接收数据过程中连接是不可断开的。
客户端的设计如图3-2所示。
一次事物流程中的步骤编号在图中给出。
4
3
7
6
1
2
图42客户端概要图
5详细设计
服务器详细设计
服务器要完成的任务是接受客户请求并在自己维护的数据结构上进行相应处理最终将处理结果返回给客户端。
具体涉及到多线程,数据库,网络通信几项技术,同时为了实时根据请求产生特定类的对象使用了反例技术。
5.1.1总体概览
服务器端的入口类为ServerMain。
聊天室服务器端代码可分为以下八个部分。
除最后两个部分外其它部分为串行执行。
在接听后,创立的线程会并发处理客户请求。
由于各个处理并发的特点,使得服务器的响应不会应为某个而用户阻塞,提高了效率。
图51聊天室服务器代码布局
服务器将用户操作抽象为不同的工作类,在接收到请求后根据消息协议在当前实现的工作类名列表中找到类名(经过下标在CommandList类中的List<
String>
commandsList属性中得到),经过反例技术直接生成类的对象。
各个类对象负责具体工作,她们都继承ServerWorkClass。
而ServerWorkClass继承自WorlClass因为客户端对服务器的回复也应当有特定的类去处理它。
当前实现的类有以下五种。
当要添加新功能时只需向commandsList属性静态添加索引。
进一步,也可在以后加入新的机制实现动态添加功能。
表52工作类名及其工作内容
类名
服务器端动作
HouseRelative
处理用户的进入、离开房间请求
Login
处理用户的上线、下线请求
Messages
处理用户的消息发送请求
UserDelAdd
处理用户注册请求
UserInfo
处理用户的用户信息查询设置请求
服务器中涉及到的类图如下所示:
5.1.2协议约定及实现
由于要考虑客户端的各个请求需要完成不同的操作,需要根据数据来内容来做特定的工作,本聊天室将通信协议定义如下:
userID:
服务器经过此ID确定消息是由哪个用户发出的。
authorizationcode:
服务器对用户身份进行认证的域,每次在接受用户请求后都会更新一个随机数,而且将内容返回,而用户在请求服务器时必须使用最新的验证码否则不会得到服务器响应。
这防止了非法用户的不正当操作。
command:
表示用户的请求类型其值为具体操作的工作类在commandsList中的下标,服务器经过此下标找到类名产生类的对象。
到这里为止的工作都是由一个CommandHandler的类的对象来完成,它实现了Runnable接口,在Accepter类的对象接受到消息后产生一个线程来执行对消息的下一步处理,其主要工作就是经过WorkingClassFactory使用反例技术产生具体工作类,之后调用工作类的doJob()方法完成任务。
command2:
一个具体工作类是对一类操作的抽象,如与房间相关的操作可能包括进房间和出房间,而具体内容就是根据command2来标示的。
从这里开始的工作已经进入到了WorkingClass的代码区域。
result:
是服务器向客户端告知请求是否正常完成的字段。
之后就是具体消息的定义区域。
首先一个MessageAmount来表示消息个数,而之后每条消息都有一个int域来表示其长度。
为了支持中文,采用字符数组而不是字节数组。
服务器和客户端都将协议下的具体报文封装在了PacketUnit类中,其主要提供了一个经过输入流来构建自身的构造方法和重写了toString方法以便发送时序列化。
PacketUnit的产生源头是GUI的监听处理函数。
由特定部位按钮或组件调用PackUnitGenerator类的特定静态方法产生特定的对象。
5.1.3初始化数据库
数据库采用JAVA数据库JDBC技术。
一般步骤为加载特定数据库驱动,产生建立连接的URL,根据URL连接数据库,在连接上创立statement类的对象进行查询和更新任务的发送。
与数据库有关的所有工作都由DataBaseServer类来完成。
由于考虑到聊天室中大部分操作不需要数据库,而且全程一个连接可能在并发过程中会导致潜在的错误,在初始化中只进行了驱动的加载。
之后需要查询或更新数据库时经过创立DataBaseServer类的对象来创立新的连接,以对象为单位向数据库发送查询请求。
DataBaseServer主要提供以下几个方法:
publicstaticvoidinit();
完成数据库驱动的加载,而且由于静态方法第一次调用,获取服务器连接的DataBaseServer静态属性URL也会在此时生成。
publicDataBaseServer();
DataBaseServer的构造函数,每次调用都会创立一条向MYSQL数据库的连接。
publicintupdateQuery(Stringjob);
向已连接的数据库发送一个更新请求,参数为SQL更新语句。
publicResultSetgetResult(Stringjob);
向已连接的数据库发送一个查询请求,参数为SQL查询语句。
而且返回一个ResultSet结果,是一个包含了查询结果的对象。
具体代码位于DataBaseServer.java文件内。
数据库采用MySQL数据库,使用到了两张表,定义如下:
userinfo表:
表项
类型
uid
int
name
varchar
password
gender
char
telearea
telephone
nickname
birthyear
birthmonth
birthday
homeland
info
houseinfo表:
hid
shid
housename
ouid
createyear
createmonth
createday
houseinfo
varbinary
5.1.4初始化用户信息
用户信息不但是服务器对客户端的抽象,也是服务器内部对用户进行管理最基本的类。
在服务器中以User类来表示用户。
其有用户的基本个人信息,以及用户所在客户端的IP和端口(在Login过程后初始化),和用户当前所在房间的列表(以便用户名等信息更新时及时通知所有看得到此用户的用户)。
属性:
homeLand:
String
uid:
int
info:
userName:
authCode:
password:
ipAddress:
InetAddress
gender:
char
port:
telearea:
ipAddressEvil:
telephone:
portEvil:
nickname:
currentHouse:
List<
House>
birthYear:
ownHouse:
birthMonth:
birthDay:
总体上,服务器在初始化时从数据库中直接读取所有用户,而且将她们存储于线下用户的userAll表中(这里有一个基本约定:
服务器启动时是没有用户在线的),而在线用户则存储在另一个userCul表中,这两个表在服务器中表示了当前的所有用户的集合。
而这两个表的维护归一个叫做UserFactory的类来管理,它负责向外界提供User对象采用了工厂设计模式,而且采用了单例模式,因为一个服务器只需一个工厂进行管理。
用户初始化的流程如下:
UserFactory对外提供如下几个方法:
publicUsergetByUid(intuid);
经过用户编号获得User类的对象。
publicUsergetByName(Stringname);
经过用户名获得User类的对象。
publicUsercreateUser(String[]messages);
创立一个用户而且将其写入数据库,同时存入userAll。
publicUserupdateUser(String[]messages,UseruserTmp);
更新一个用户的信息,将其写入到数据库中。
用户名改变造成的客户端与服务器不一致由UserInfo类处理,一般情况下此方法也只由UserInfo类的对象调用。
publicvoidloginAUser(Userutm);
使一个用户由线下状态转换为线上状态。
即从userAll表转移到userCul表。
publicvoidlogoffAUser(Userutm);
与loginAUser相反。
publicbooleanisOnline(intuid);
检查一个用户是否在线。
publicbooleanisExists(intuid);
经过UID检查指定用户是否存在。
publicbooleanisExists(StringcheckName);
经过用户名检查指定用户是否存在。
publicList<
User>
getUserCur();
获取所有在线用户。
具体代码位于UserFactory.java内。
5.1.5初始化房间信息
房间是用户间通信的场所,通信不可能从一个房间到另一个房间。
在服务器中房间用House类表示。
为此,房间主要维护一个房间内用户的表,以便某个用户发送消息时使服务器知道该把消息发送给谁。
房间信息的初始化类比用户信息的初始化,也使用了工厂模式和单例技术,只是少了在线不在线这个概念。
House的工厂类为HouseFactory。
其向外提供了经过HID或房间名来获取房间对象的方法。