版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JAVA程序设计多人聊天室1设计目的Java编程语言是个简单、面向对象、分布式、解释性、健壮、平安与系统无关、可移植、高性能、多线程和静态的语言。本次课程设计旨在应用JAVA编程语言中的网络通信,多线程,数据库编程,图形界面编程等技术实现一个根本的 多人在线网络聊天室。并以此稳固 JAVA根底知识,体会面向对象的设计方法。2平台要求2.1使用:搭载JAVA运行环境的平台即可。2.2开发环境:Win dowslO 64bitWin dow Builder3需求分析管理员:启动效劳器,关闭效劳器,强制用户退出,聊天房间增添改查。 用户:GUI,注册,登陆,聊天等。用例图:4概要设计4.1效劳器设计
2、将客户端的请求抽象化,每种请求效劳器都会产生一个特定的类的对象去处 理它。效劳器负责接受客户端请求,根据请求内容完成指定工作。为提高效率, 采用多线程结合线程池设计技术,对于每个请求在线程池内得到一个线程去处理 请求。如图3-1所示。4.2客户端设计聊天室中一个事物的过程根本流程是: 用户产生动作,客户端发送消息,服 务器接收并处理,效劳器返回处理结果,GUI根据结果进行显示的更新。客户端只在GUI中采用多线程设计。而对效劳器回应的接受都是单线程的因为只有一个 效劳器为自己效劳,且在接收数据过程中连接是不可断开的。 客户端的设计如图 3-2所示。一次事物流程中的步骤编号在图中给出。图4-1效劳
3、器概要图Start UpInit Client Components5详细设计5.1效劳器详细设计效劳器要完成的任务是接受客户请求并在自己维护的数据结构上进行相应 处理最终将处理结果返回给客户端。 具体涉及到多线程,数据库,网络通信几项 技术,同时为了实时根据请求产生特定类的对象使用了反例技术。总体概览效劳器端的入口类为ServerMain。聊天室效劳器端代码可分为以下八个局部。 除最后两个局部外其他局部为串行执行。在接听后,创立的线程会并发处理客户请求。由于各个处理并发的特点,使得效劳器的响应不会应为某个而用户阻塞, 提高了效率。图5-1聊天室效劳器代码布局效劳器将用户操作抽象为不同的工作类
4、,在接收到请求后根据消息协议在当 前实现的工作类名列表中找到类名通过下标在CommandList类中的ListvString> commandsList属性中得到,通过反例技术直接生成类的对象。各个类对象负责 具体工作,他们都继承 ServerWorkClass而ServerWorkClass继承自 WorlClass因 为客户端对效劳器的回复也应当有特定的类去处理它。目前实现的类有以下五种。当要添加新功能时只需向comma ndsList属性静态添加索引。进一步,也可在以 后参加新的机制实现动态添加功能。表5-2工作类名及其工作内容类名效劳器端动作HouseRelative处理用户的进
5、入、离开房间请求Logi n处理用户的上线、下线请求Messages处理用户的消息发送请求UserDelAdd处理用户注册请求UserI nfo处理用户的用户信息查询设置请求效劳器中涉及到的类图如下所示:由于要考虑客户端的各个请求需要完成不同的操作,做特定的工作,本聊天室将通信协议定义如下:Mr iiace-l Lcnf1:h1hIXnglhi"fifthLffiphi协议约定及实现需要根据数据来内容来userID:效劳器通过此ID确定消息是由哪个用户发出的。authorization code:效劳器对用户身份进行认证的域,每次在接受用户请求 后都会更新一个随机数,并且将内容返回,
6、而用户在请求效劳器时必须使用最新 的验证码否那么不会得到效劳器响应。这防止了非法用户的不正当操作。comma nd:表示用户的请求类型其值为具体操作的工作类在comma ndsList中的下标,效劳器通过此下标找到类名产生类的对象。到这里为止的工作都是由一个CommandHandler的类的对象来完成,它实现了 Runnable接口,在Accepter 类的对象接受到消息后产生一个线程来执行对消息的下一步处理,其主要工作就是通过WorkingClassFactory使用反例技术产生具体工作类,之后调用工作类的 doJob()方法完成任务。comma nd2: 个具体工作类是对一类操作的抽象,如
7、与房间相关的操作可 能包括进房间和出房间,而具体内容就是根据command2来标示的。从这里开始 的工作已经进入到了 WorkingClass的代码区域。result :是效劳器向客户端告知请求是否正常完成的字段。之后就是具体消息的定义区域。首先一个MessageAmount来表示消息个数, 而之后每条消息都有一个int域来表示其长度。为了支持中文,采用字符数组而 不是字节数组。效劳器和客户端都将协议下的具体报文封装在了 PacketUnit类中,其主要提 供了一个通过输入流来构建自身的构造方法和重写了 toString方法以便发送时序 列化。PacketUnit的产生源头是GUI的监听处理函
8、数。由特定部位按钮或组件调用 PackU nitGe nerator类的特定静态方法产生特定的对象。初始化数据库数据库采用JAVA数据库JDBC技术。一般步骤为加载特定数据库驱动,产生 建立连接的URL根据URL连接数据库,在连接上创立statement类的对象进行 查询和更新任务的发送。与数据库有关的所有工作都由 DataBaseServei类来完成。 由于考虑到聊天室中大局部操作不需要数据库,并且全程一个连接可能在并发过程中会导致潜在的错误,在初始化中只进行了驱动的加载。 之后需要查询或更新 数据库时通过创立DataBaseServei的对象来创立新的连接,以对象为单位向数 据库发送查询请
9、求。DataBaseServe主要提供以下几个方法:public static void init ();完成数据库驱动的加载,并且由于静态方法第一次调用,获取效劳器连接的DataBaseServe静态属性URL也会在此时生成。public DataBaseServer ();DataBaseServer的构造函数,每次调用都会创立一条向MYSQL数据库的连接。public int updateQuery(String job);向已连接的数据库发送一个更新请求,参数为SQL更新语句。public ResultSet getResult(String job );向已连接的数据库发送一个查询请
10、求,参数为SQL查询语句。并且返回一个ResultSet结果,是一个包含了查询结果的对象。具体代码位于DataBaseServer.jav文件内。数据库采用MySQL数据库,使用到了两张表,定义如下:userinfo 表:表项类型uidintn amevarcharpasswordvarchargendercharteleareacharteleph onecharnickn amevarcharbirthyearintbirthm on thintbirthdayinthomela ndvarcharinfovarcharhouse info 表:表项类型hidintshidinthouse
11、 namevarcharouidintcreateyearintcreatemo nthintcreatedayinthouse infovarb inary初始化用户信息属性:类型 uid : intuserName : String password : String gender:char telearea : String teleph one : Str ing nickn ame : String birthYear: int birthMonth : int用户信息不仅是效劳器对客户端的抽象,也是效劳器内部对用户进行管理最 根本的类。在效劳器中以User类来表示用户。其有用户的根
12、本个人信息,以及 用户所在客户端的IP和端口在Login过程后初始化,和用户当前所在房间的 列表以便用户名等信息更新时及时通知所有看得到此用户的用户。属性:类型homeLa nd : String info : Stri ng authCode : int ipAddress : In etAddress port : int ipAddressEvil : In etAddress portEvil : int curre ntHouse : List<House> ownH ouse : List<House>总体上,效劳器在初始化时从数据库中直接读取所有用户,并且
13、将他们存储 于线下用户的userAII表中这里有一个根本约定:效劳器启动时是没有用户在 线的,而在线用户那么存储在另一个userCul表中,这两个表在效劳器中表示了当 前的所有用户的集合。而这两个表的维护归一个叫做UserFactory的类来管理,它负责向外界提供User对象采用了工厂设计模式,并且采用了单例模式,因为 一个效劳器只需一个工厂进行管理。用户初始化的流程如下:public User updateUser (String messages , User userTmp );更新一个用户的信息,将其写入到数据库中。用户名改变造成的客户端与服 务器不一致由UserInfo类处理,一般情
14、况下此方法也只由UserInfo类的对象 调用。public void log in AUser( User utm );public boolean isExists (String checkName);通过用户名检查指定用户是否存在。public List <User > getUserCur ();获取所有在线用户。具体代码位于内。初始化房间信息房间是用户间通信的场所,通信不可能从一个房间到另一个房间。 在效劳器 中房间用House类表示。为此,房间主要维护一个房间内用户的表, 以便某个用 户发送消息时使效劳器知道该把消息发送给谁。房间信息的初始化类比用户信息的初始化,也使
15、用了工厂模式和单例技术, 只是少了在线不在线这个概念。House的工厂类为HouseFactory。其向外提供了通过HID或房间名来获取房 间对象的方法。不再赘述。设置本地发送端的 Socket为了实现异步通信,在通信过程中客户端和效劳器总共需要四个Socke,分别用于效劳器接受,效劳器发送,客户端接受,客户端发送。必须先设置发送端 的信息,后设置接受端的信息以防止接收到请求处理完而无法发送导致的数据不 一致问题。效劳器在这里设置设置效劳器发送端的Socket通过ServerMain类调用Sender.init()来实现。而效劳器发送的任务完全交给Sender类。它主要提供一个send方法,参
16、数是报文信息和用户,通过将报文信息字节化,获取用户的接 受Socket得到发送地址和发送内容,从而执行发送过程。监听监听的工作由Accepter类完成,它实现 Runnable接口,在ServerMain准备 好了所有内部数据后会调用 ServerMain.startAcceoter方法来设置Accepter监听 的本地端口,并且启用一个新线程来监听。Accepter的run方法内创立了一个线程池,从此进入一个无限循环,内部工 作为监听端口,获取输入流,产生PacketUnit,产生一个 Commandhandler并包装为Thread对象后开启新的线程事物处理事务处理由WorkingClas
17、s的几个子类具体执行。LoginWorkingClass+PacketUnit myPackUnitServerWorkingClass+User myUserWorkingClass有一个PacketUnit类的属性因为WorkingClass的工作是围绕接 收到的数据展开的,所有 WorkingClass子类都应该有此成员,此成员在 CommandHandler类内部产生WorkingClass时将其赋值。ServerWorki ngClass的子类都处于效劳器内,主要工作就是根据请求改变服 务器数据结构属于整个流程中的第四步见图XXX有一个属性User myUser,用于告知效劳器现在效
18、劳的用户以便对效劳器维护的数据进行更新。Clie ntWorki ngClass的子类都处于客户端内,工作是根据效劳器的反应告诉 GUI做适当的显示。负责整个流程中的第七步。各子类的工作逻辑详见代码。这里简单列出流程图。Log in:协议:Logcut ctwndnd?> 1message amount - 0Login ustri<l *duthcade 二号connidiidiz : eamount 2messgS namenessdf;! pds&uord nesdgt1! receive port /*Agel mdn空 uiernante*/流程:注意:由于第一次
19、登陆是客户端无法知道UID所以myUser属性只能通过消息中的用户名获得。返回消息时会设置登陆成功的客户UID由客户端维持。HouseRelativegetl nH ouse:userid = u&erld. authcode = juthcodemessage “wunt 1e 沁 hou&enipe/ >ness»g«ihousenaMeLeaveHouseuserid userids airthcode authcodecofinandi 1amount = 1messaged w housenneMessagesusenld - userid.
20、authcode = authcodecommands = a message amount - 2= hou renameme»gel oiessjee from input field通过 messagO获取House对象通知房间内的 每个用户消息到来UserDelAdduserid duthcode =亠1 cofrwiand2 = 6ainount = 12mcssagcE - Userln+osUserl nfoget:userid = userid authcode = authCode command2 = 0 message amount = 1 messaged -
21、 username=userid, authcode = authCode command2 = 1 message amount = 12 messages = userinfo5.2客户打量细设计总体概览客户端主要运用到了 GUI和网络通信技术。涉及到的类之间的关系如下:CommandHandlerSenderClientAccepterWorkClassFactoryLogin客户端执行任务的根本流程如下:登陆或注册等待效劳器回 复产生特定工作 类更新显示开启登陆界面 开启接收线程登录界面Login按钮的监听器会调用 PackUnitGenerator来产生一个登录请求的数 据包,内容见
22、登陆局部。之后除了接收线程还在等待效劳器回复外不再进行任何 动作。接受到回复后会根据消息产生相应的界面。Neu:Cmc&iCaocsi只有当能够登录时Next按钮才能点击, 时这个Next的监听器还会产生一条进入房间点击后,效劳器就会登录此用户。同Hall的请求,从而保证了每个用户在登录成功后会进入Hall房间。而其他房间需要用户手动进入523注册界面如上图所示。Submit按钮会检查输入是否合法,否那么会提示相应输入信息的 错误情况,Cancel会销毁这个对话框,如图。*Dhm naai.PaarfcarJUiOUIS3WHimICwmI假设输入合法会根据输入产生一个注册的数据包发往
23、效劳器但还会遇到如用户名已存在的情况。这是注册也是失败的524主界面主界面上所有按钮功能均已实现由于需要支持多房间,在消息显示区域上方有一个 Entered House下拉菜单, 里面每一项对应着一个消息显示区域和右下方的一个Curre nt User列表。分别是当前房间的消息和当前房间内的用户右上方的All House列表中的每一项代表一个房间,双击它。假设已进入房间 那么只是更改Entered House下拉菜单的当前选择项。假设没有进入过该房间那么会 产生一个进入该房间的请求。等到效劳器返回消息后由HouseRelative工作类在En teredHouse下拉菜单中创立一个条目,同时创
24、立一个该房间的消息显示区域以 及当前房间内用户的列表。这些消息都能够从效劳器返回的消息中得到。用户消息显示界面在聊天室中所有用户都可以查看自己或者别人的资料, 并且对自己的资料有 更改权。只需点击MyDetail按钮或者双击Current User列表中的用户名即可查看 消息。呻gumvl llwHarUn巴艸豪Ei EQlf Si生*爭严THI41f *1 IN VMVFEart' i tv6测试参加房间,离开房间均能在其他客户端正常显示。Currfit 旳岀消息中英文发送显示正常,所有同房间内的人都能收到HanQate:HKmjhgseiz *衣軒i泗刖lt 15时zhmnpsi汕mi剧毎用户信息显示正
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度抵押贷款房产过户合同范本3篇
- 二零二五年度工程咨询合同履约风险防范措施3篇
- 《急诊科品管圈》课件
- 二零二五年度影视制作公司与发行公司之间的影视发行合同3篇
- 整式乘除课件
- 二零二五年度奥菱达电梯紧急停电应急处理服务协议3篇
- 二零二五年度家电维修配件集中采购合同3篇
- 二零二五年度尤慧离婚后与前配偶关于财务审计的协议书3篇
- 小学科学教科版六年级上册第三单元《工具与技术》检测卷(2021新版)(附参考答案和解析)
- 二零二五年度户外公共场所防盗门安装维护合同3篇
- 当食物成为抚慰:善待自己重塑大脑告别情绪性进食
- 员工行为风险预警培训课件
- 水上交通行业安全培训
- 全域土地综合整治规划方案
- GB/T 26940-2023牡蛎干
- 黑龙江省哈尔滨市松北区2023-2024学年六年级上学期期末数学试题
- 钢材深加工行业现状分析报告
- 香港朗文英语2B期中试卷
- 慢性乙肝护理查房课件
- 林区防火专用道路技术规范
- 缆机安装方案课件
评论
0/150
提交评论