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

  • 格式:doc
  • 大小:825.50 KB
  • 文档页数:22

下载文档原格式

  / 22
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JAVA程序设计多人聊天室

1设计目的

Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和静态的语言。本次课程设计旨在应用JAVA编程语言中的网络通信,多线程,数据库编程,图形界面编程等技术实现一个基本的多人在线网络聊天室。并以此巩固JAVA基础知识,体会面向对象的设计方法。

2平台要求

2.1使用:

搭载JAVA运行环境的平台即可。

2.2开发环境:

Windows10 64bit

JDK

Eclipse

Window Builder

3需求分析

管理员:启动服务器,关闭服务器,强制用户退出,聊天房间增添改查。

用户:GUI,注册,登陆,聊天等。

用例图:

System

User

Administrator

Server

Client

Database

House delete or add

User logout

Login and logout

Chat

Enter and leaveHouse

User Info get and set

Sign Up

Start up server

4 概要设计

4.1 服务器设计

将客户端的请求抽象化,每种请求服务器都会产生一个特定的类的对象去处理它。服务器负责接受客户端请求,根据请求内容完成指定工作。为提高效率,采用多线程结合线程池设计技术,对于每个请求在线程池内得到一个线程去处理请求。如图3-1所示。

4.2 客户端设计

聊天室中一个事物的过程基本流程是:用户产生动作,客户端发送消息,服务器接收并处理,服务器返回处理结果,GUI 根据结果进行显示的更新。客户端

只在GUI 中采用多线程设计。而对服务器回应的接受都是单线程的因为只有一个服务器为自己服务,且在接收数据过程中连接是不可断开的。客户端的设计如图3-2所示。一次事物流程中的步骤编号在图中给出。

图 4-2客户端概要图

5 详细设计

5.1 服务器详细设计

服务器要完成的任务是接受客户请求并在自己维护的数据结构上进行相应处理最终将处理结果返回给客户端。具体涉及到多线程,数据库,网络通信几项技术,同时为了实时根据请求产生特定类的对象使用了反例技术。

5.1.1 总体概览

服务器端的入口类为ServerMain 。聊天室服务器端代码可分为以下八个部分。除最后两个部分外其他部分为串行执行。在接听后,创建的线程会并发处理客户请求。由于各个处理并发的特点,使得服务器的响应不会应为某个而用户阻塞,提高了效率。

1 2

3 4

6

7

图 5-1聊天室服务器代码布局

服务器将用户操作抽象为不同的工作类,在接收到请求后根据消息协议在当前实现的工作类名列表中找到类名(通过下标在CommandList类中的List commandsList属性中得到),通过反例技术直接生成类的对象。各个类对象负责具体工作,他们都继承ServerWorkClass。而ServerWorkClass 继承自WorlClass因为客户端对服务器的回复也应当有特定的类去处理它。目前实现的类有以下五种。当要添加新功能时只需向commandsList属性静态添加索引。进一步,也可在以后加入新的机制实现动态添加功能。

表 5-2工作类名及其工作内容

类名服务器端动作

HouseRelative处理用户的进入、离开房间请求

Login处理用户的上线、下线请求

Messages处理用户的消息发送请求

UserDelAdd处理用户注册请求

UserInfo处理用户的用户信息查询设置请求

5.1.2协议约定及实现

由于要考虑客户端的各个请求需要完成不同的操作,需要根据数据来内容来做特定的工作,本聊天室将通信协议定义如下:

userID:服务器通过此ID确定消息是由哪个用户发出的。

authorization code:服务器对用户身份进行认证的域,每次在接受用户请求后都会更新一个随机数,并且将内容返回,而用户在请求服务器时必须使用最新的验证码否则不会得到服务器响应。这防止了非法用户的不正当操作。

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主要提供以下几个方法:

public static void init();

完成数据库驱动的加载,并且由于静态方法第一次调用,获取服务器连接的DataBaseServer静态属性URL也会在此时生成。

public DataBaseServer();

DataBaseServer的构造函数,每次调用都会创建一条向MYSQL数据库的连接。

public int updateQuery(String job);

向已连接的数据库发送一个更新请求,参数为SQL更新语句。

public ResultSet getResult(String job);

向已连接的数据库发送一个查询请求,参数为SQL查询语句。并且返回一个ResultSet结果,是一个包含了查询结果的对象。

具体代码位于文件内。

数据库采用MySQL数据库,使用到了两张表,定义如下:

userinfo表: