ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:726.09KB ,
资源ID:9907630      下载积分:12 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/9907630.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(java大作业设计报告JAVA聊天室.docx)为本站上传会员【快乐****生活】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

java大作业设计报告JAVA聊天室.docx

1、 java大作业设计报告JAVA聊天室 31 2020年4月19日 文档仅供参考 JAVA程序设计 多人聊天室 1 设计目的 Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和静态的语言。本次课程设计旨在应用JAVA编程语言中的网络通信,多线程,数据库编程,图形界面编程等技术实现一个基本的多人在线网络聊天室。并以此巩固JAVA基础知识,体会面向对象的设计方法。 2 平台要求

2、2.1 使用: 搭载JAVA运行环境的平台即可。 2.2 开发环境: Windows10 64bit JDK 1.8 Eclipse 4.4 Window Builder 3 需求分析 管理员:启动服务器,关闭服务器,强制用户退出,聊天房间增添改查。 用户:GUI,注册,登陆,聊天等。 用例图: 4 概要设计 4.1 服务器设计 将客户端的请求抽象化,每种请求服务器都会产生一个特定的类的对象去处理它。服务器负责接受客户端请求,根据请求内容完成指定工作。为提高效率,采用多线程结合线程池设计技术,对于每个请求在线程池内得到一个线程去处理请求。如图3-1所示。

3、4.2 客户端设计 5 图 41服务器概要图 聊天室中一个事物的过程基本流程是:用户产生动作,客户端发送消息,服务器接收并处理,服务器返回处理结果,GUI根据结果进行显示的更新。客户端只在GUI中采用多线程设计。而对服务器回应的接受都是单线程的因为只有一个服务器为自己服务,且在接收数据过程中连接是不可断开的。客户端的设计如图3-2所示。一次事物流程中的步骤编号在图中给出。 4 3 7 6 1 2 图 42客户端概要图 5 详细设计 5.1 服务器详细设计 服务器要完成的任务是接受客户请求并在自己维护的数据结构上进行相应处理最终将处理结果返回给客户端。具体涉及到

4、多线程,数据库,网络通信几项技术,同时为了实时根据请求产生特定类的对象使用了反例技术。 5.1.1 总体概览 服务器端的入口类为ServerMain。聊天室服务器端代码可分为以下八个部分。除最后两个部分外其它部分为串行执行。在接听后,创立的线程会并发处理客户请求。由于各个处理并发的特点,使得服务器的响应不会应为某个而用户阻塞,提高了效率。 图 51聊天室服务器代码布局 服务器将用户操作抽象为不同的工作类,在接收到请求后根据消息协议在当前实现的工作类名列表中找到类名(经过下标在CommandList类中的List commandsList属性中得到),经过反例技

5、术直接生成类的对象。各个类对象负责具体工作,她们都继承ServerWorkClass。而ServerWorkClass继承自WorlClass因为客户端对服务器的回复也应当有特定的类去处理它。当前实现的类有以下五种。当要添加新功能时只需向commandsList属性静态添加索引。进一步,也可在以后加入新的机制实现动态添加功能。 表 52工作类名及其工作内容 类名 服务器端动作 HouseRelative 处理用户的进入、离开房间请求 Login 处理用户的上线、下线请求 Messages 处理用户的消息发送请求 UserDelAdd 处理用户注册请求 UserIn

6、fo 处理用户的用户信息查询设置请求 服务器中涉及到的类图如下所示: 5.1.2 协议约定及实现 由于要考虑客户端的各个请求需要完成不同的操作,需要根据数据来内容来做特定的工作,本聊天室将通信协议定义如下: userID:服务器经过此ID确定消息是由哪个用户发出的。 authorization code:服务器对用户身份进行认证的域,每次在接受用户请求后都会更新一个随机数,而且将内容返回,而用户在请求服务器时必须使用最新的验证码否则不会得到服务器响应。这防止了非法用户的不正当操作。 command:表示用户的请求类型其值为具体操作的工作类在commandsList中的下标

7、服务器经过此下标找到类名产生类的对象。到这里为止的工作都是由一个CommandHandler的类的对象来完成,它实现了Runnable接口,在Accepter类的对象接受到消息后产生一个线程来执行对消息的下一步处理,其主要工作就是经过WorkingClassFactory使用反例技术产生具体工作类,之后调用工作类的doJob()方法完成任务。 command2:一个具体工作类是对一类操作的抽象,如与房间相关的操作可能包括进房间和出房间,而具体内容就是根据command2来标示的。从这里开始的工作已经进入到了WorkingClass的代码区域。 result:是服务器向客户端告知请求是否正

8、常完成的字段。 之后就是具体消息的定义区域。首先一个MessageAmount来表示消息个数,而之后每条消息都有一个int域来表示其长度。为了支持中文,采用字符数组而不是字节数组。 服务器和客户端都将协议下的具体报文封装在了PacketUnit类中,其主要提供了一个经过输入流来构建自身的构造方法和重写了toString方法以便发送时序列化。 PacketUnit的产生源头是GUI的监听处理函数。由特定部位按钮或组件调用PackUnitGenerator类的特定静态方法产生特定的对象。 5.1.3 初始化数据库 数据库采用JAVA数据库JDBC技术。一般步骤为加载特定数据库驱动,产生建

9、立连接的URL,根据URL连接数据库,在连接上创立statement类的对象进行查询和更新任务的发送。与数据库有关的所有工作都由DataBaseServer类来完成。由于考虑到聊天室中大部分操作不需要数据库,而且全程一个连接可能在并发过程中会导致潜在的错误,在初始化中只进行了驱动的加载。之后需要查询或更新数据库时经过创立DataBaseServer类的对象来创立新的连接,以对象为单位向数据库发送查询请求。 DataBaseServer主要提供以下几个方法: public static void init(); 完成数据库驱动的加载,而且由于静态方法第一次调用,获取服务器连接的DataBa

10、seServer静态属性URL也会在此时生成。 public DataBaseServer(); DataBaseServer的构造函数,每次调用都会创立一条向MYSQL数据库的连接。 public int updateQuery(String job); 向已连接的数据库发送一个更新请求,参数为SQL更新语句。 public ResultSet getResult(String job); 向已连接的数据库发送一个查询请求,参数为SQL查询语句。而且返回一个ResultSet结果,是一个包含了查询结果的对象。 具体代码位于DataBaseServer.java文件内。 数据库

11、采用MySQL数据库,使用到了两张表,定义如下: userinfo表: 表项 类型 uid int name varchar password varchar gender char telearea char telephone char nickname varchar birthyear int birthmonth int birthday int homeland varchar info varchar houseinfo表: 表项 类型 hid int shid int housename va

12、rchar ouid int createyear int createmonth int createday int houseinfo varbinary 5.1.4 初始化用户信息 用户信息不但是服务器对客户端的抽象,也是服务器内部对用户进行管理最基本的类。在服务器中以User类来表示用户。其有用户的基本个人信息,以及用户所在客户端的IP和端口(在Login过程后初始化),和用户当前所在房间的列表(以便用户名等信息更新时及时通知所有看得到此用户的用户)。 属性:类型 属性:类型 homeLand : String uid : int

13、 info : String userName : String authCode : int password : String ipAddress : InetAddress gender : char port : int telearea : String ipAddressEvil : InetAddress telephone : String portEvil : int nickname : String currentHouse : List birthYear: int

14、 ownHouse : List birthMonth : int birthDay :int 总体上,服务器在初始化时从数据库中直接读取所有用户,而且将她们存储于线下用户的userAll表中(这里有一个基本约定:服务器启动时是没有用户在线的),而在线用户则存储在另一个userCul表中,这两个表在服务器中表示了当前的所有用户的集合。而这两个表的维护归一个叫做UserFactory的类来管理,它负责向外界提供User对象采用了工厂设计模式,而且采用了单例模式,因为一个服务器只需一个工厂进行管理。 用户初始化的流程如下: UserFactory对外提供

15、如下几个方法: public User getByUid(int uid); 经过用户编号获得User类的对象。 public User getByName(String name); 经过用户名获得User类的对象。 public User createUser(String[] messages); 创立一个用户而且将其写入数据库,同时存入userAll。 public User updateUser(String[] messages,User userTmp); 更新一个用户的信息,将其写入到数据库中。用户名改变造成的客户端与服务器不一致由UserInfo类处理,一般

16、情况下此方法也只由UserInfo类的对象调用。 public void loginAUser(User utm); 使一个用户由线下状态转换为线上状态。即从userAll表转移到userCul表。 public void logoffAUser(User utm); 与loginAUser相反。 public boolean isOnline(int uid); 检查一个用户是否在线。 public boolean isExists(int uid); 经过UID检查指定用户是否存在。 public boolean isExists(String checkName);

17、经过用户名检查指定用户是否存在。 public List getUserCur(); 获取所有在线用户。 具体代码位于UserFactory.java内。 5.1.5 初始化房间信息 房间是用户间通信的场所,通信不可能从一个房间到另一个房间。在服务器中房间用House类表示。为此,房间主要维护一个房间内用户的表,以便某个用户发送消息时使服务器知道该把消息发送给谁。 房间信息的初始化类比用户信息的初始化,也使用了工厂模式和单例技术,只是少了在线不在线这个概念。 House的工厂类为HouseFactory。其向外提供了经过HID或房间名来获取房间对象的方法。不再赘述

18、 5.1.6 设置本地发送端的Socket 为了实现异步通信,在通信过程中客户端和服务器总共需要四个Socket,分别用于服务器接受,服务器发送,客户端接受,客户端发送。必须先设置发送端的信息,后设置接受端的信息以防止接收到请求处理完而无法发送导致的数据不一致问题。服务器在这里设置设置服务器发送端的Socket。经过ServerMain类调用Sender.init()来实现。而服务器发送的任务完全交给Sender类。它主要提供一个send方法,参数是报文信息和用户,经过将报文信息字节化,获取用户的接受Socket得到发送地址和发送内容,从而执行发送过程。 5.1.7 监听 监听的工作

19、由Accepter类完成,它实现Runnable接口,在ServerMain准备好了所有内部数据后会调用ServerMain.startAcceoter方法来设置Accepter监听的本地端口,而且启用一个新线程来监听。 Accepter的run方法内创立了一个线程池,从此进入一个无限循环,内部工作为监听端口,获取输入流,产生PacketUnit,产生一个Commandhandler并包装为Thread对象后开启新的线程。 5.1.8 事物处理 事务处理由WorkingClass的几个子类具体执行。 WorkingClass有一个PacketUnit类的属性因为WorkingC

20、lass的工作是围绕接收到的数据展开的,所有WorkingClass子类都应该有此成员,此成员在CommandHandler类内部产生WorkingClass时将其赋值。 ServerWorkingClass的子类都处于服务器内,主要工作就是根据请求改变服务器数据结构属于整个流程中的第四步(见图xxx)。有一个属性User myUser,用于告知服务器现在服务的用户以便对服务器维护的数据进行更新。 ClientWorkingClass的子类都处于客户端内,工作是根据服务器的反馈告诉GUI做适当的显示。负责整个流程中的第七步。 各子类的工作逻辑详见代码。这里简单列出流程图。 Login:

21、 协议: 流程: 注意:由于第一次登陆是客户端无法知道UID因此myUser属性只能经过消息中的用户名获得。返回消息时会设置登陆成功的客户UID由客户端维持。 HouseRelative: getInHouse: LeaveHouse: Messages: UserDelAdd UserInfo 5.2 客户端详细设计 5.2.1 总体概览 客户端主要运用到了GUI和网络通信技术。涉及到的类之间的关系如下: 客户端执行任务的基本流程如下: 5.2.2 登录界面

22、 Login按钮的监听器会调用PackUnitGenerator来产生一个登录请求的数据包,内容见5.1.8登陆部分。之后除了接收线程还在等待服务器回复外不再进行任何动作。接受到回复后会根据消息产生相应的界面。 只有当能够登录时Next按钮才能点击,点击后,服务器就会登录此用户。同时这个Next的监听器还会产生一条进入房间Hall的请求,从而保证了每个用户在登录成功后会进入Hall房间。而其它房间需要用户手动进入。 5.2.3 注册界面 如上图所示。Submit按钮会检查输入是否合法,否则会提示相应输

23、入信息的错误情况,Cancel会销毁这个对话框,如图。 若输入合法会根据输入产生一个注册的数据包发往服务器。但还会遇到如用户名已存在的情况。这是注册也是失败的。 5.2.4 主界面 主界面上所有按钮功能均已实现。 由于需要支持多房间,在消息显示区域上方有一个Entered House下拉菜单,里面每一项对应着一个消息显示区域和右下方的一个Current User列表。分别是当前房间的消息和当前房间内的用户。 右上方的All House列表中的每一项代表一个房间,双击它。若已进入房间则只是更改Entered House下拉菜单的当前选择项。若没有进入过该房间则会产

24、生一个进入该房间的请求。等到服务器返回消息后由HouseRelative工作类在EnteredHouse下拉菜单中创立一个条目,同时创立一个该房间的消息显示区域以及当前房间内用户的列表。这些消息都能够从服务器返回的消息中得到。 5.2.5 用户消息显示界面 在聊天室中所有用户都能够查看自己或者别人的资料,而且对自己的资料有更改权。只需点击MyDetail按钮或者双击Current User列表中的用户名即可查看消息。 6 测试 加入房间,离开房间均能在其它客户端正常显示。 消息中英文发送显示正常,所有同房间内的人都能收到。 用户信息显示正确工作。见5.2.5节。

25、 7 优缺点分析 7.1 优点 1、 服务器采用多线程应对客户端请求而且结合线程池技术。使得服务器的并发量较大。 2、 服务器采用将数据协议规范化,使得任务处理流程清晰。 3、 服务器将对同请求产生特定的类去处理,使得各个工作之间相互分离而且使得扩展更加容易。 4、 服务器将数据大部分存储在内存中减少了对数据库的访问。 5、 客户端采用了接收信息对GUI进行处理的模型,使发送请求和得到响应之间异步进行从而使得交互性更好。 7.2 缺点 1、 构建工作类模型及其框架的实现花费大量代码和时间。虽然扩展性的到了提高,可是由于时间关系只能实现少数几个功能。用户注销,好友功能,文件传输

26、功能,私聊功能这些都是工程计划中的一部分,都需要实现。 2、 GUI美观性较差。 8 总结 经过一段时间的努力我们小组实现了这个简单的JAVA聊天室系。从数据库支持下的注册用户信息更改功能,到多线程网络通信支持下的多房间多人聊天功能,到GUI支持下的交互界面,我们实现了对聊天功能的基本抽象与实现。 由于刚刚接触JAVA语言特别是GUI编程,我们的聊天室显得有些简陋,由于时间的关系我们也没有去更细心地去修改界面。但经过这个工程的学习,我们掌握了多项JAVA编程技术。其中的数据库,多线程,网络通信更是对我们以后的工作生涯有很大的启发和帮助。我们现在已不但限于只能编出一个在控制台下输入输出字符的命令行程序了。这极大地丰富了我们的编程经历。 同时我们学到了设计需要的团队精神。xxx同学完成了聊天室中具体技术的总结和介绍(线程池、数据库、网络通信等具体技术)。服务器和客户端的具体工作类中与房间相关、聊天消息相关类的实现。同时对通信做出了很大的优化,如字节数组到字符数组的迁移使得聊天室支持中文以及其它文字。UDP到TCP的迁移解决了项目早期频发的丢包问题。xxx同学完成了对服务器的建模、GUI的实现、以及其它工作类的实现。

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服