Java项目设计报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ExamInfo存放用户信息
User存放用户信息
4.在线功能类
ExamServer服务器
ExamServerAgent在线功能实现类
Request请求类
Response回应类
ServerStart服务器启动
Util系统工具类
5.入口
ClientMain入口
6.功能实现类
ExamService考试功能实现类
在客户机这边,我们只需要考虑一个线程就行了,所以这里我们只要四个类,其中有三个是窗口类,另一个是与服务器线程连接的类,这个连接类是作为三个窗口类的一个属性,用于三个窗口与服务器之间发送数据用,三个窗口也只能通过这个连接类与服务器之间进行通信,这三个窗口是依次通过这个连接类与服务器进行通信的。这样这个客服器的整体设计也就出来了。
this.user=use;
returnthis.user;
}
List<QuestionInfo>allquestions=newArrayList<QuestionInfo>();
@Override
publicExamInfo createpaper() {
Random r=newRandom();
importcom.tarena.elts.entity.Question;
importcom.tarena.elts.entity.QuestionInfo;
importcom.tarena.elts.entity.User;
importcom.tarena.elts.ui.Guize;
importcom.tarena.elts.ui.Zhuce;
8,如果静态常量4,就表示学生要退出考试的界面,这时候,客户端关闭,服务器接收到退出请求之后,就要直接跳出循环,然后关闭与之连接的流和套接字连接。
9,经过以上几个步骤,学生在线考试过程全部结束。
2.客户端窗口类
客户端窗口类,主要是让用户直接在指定的地方输入信息,然后进入在线考试过程,这里,首先是让学生输入信息,确认身份,主要的是学号和密码,然后就是选择科目,最后进入考试界面,最后交卷,退出,这几个以窗口形式呈现给用户的,下面主要介绍程序的运行过程:
学生在线考试系统主要分成两个部分,一个是服务器部分,另一个则是客户机部分,服务器与客户端之间是以通过网路连接起来的,服务器的一个线程与一个客户机是连接着的。
在服务器部分,服务器先启动,先是读取配置文件,然后将试卷信息读取到服务器中,还要读取学生的信息,学号,姓名,密码,都要读取到服务器中,对于这些信息的读取,将会被封装在其他的类中,然后才是等待客户端发送数据连接请求,一旦发现有请求,就创建一个服务线程与之保持连接,等待考试完成的数据请求发送过来,才断开连接,在这其中服务器是一直处于监听客户端请求连接的运行状态。在整个运行过程,服务器都是以控制台程序运行。
客户端部分,则是比较简单,因要给学生操作,所以,为了方便操作,这里用到了图形界面的操作,这里一共有三个部分的界面,第一个就是学生登录的界面,学生要输入学号和密码登录服务器,第二个就是学生选择考试科目的界面,这里呢,要先将前面一个窗口销毁,然后再创建新的窗口,第三个就是学生考试界面的窗口,这个窗口稍微复杂点,涉及到许多东西,这里在第三个窗口创建之前也是要先销毁第二个窗口。最后用户点击交卷完成考试过程,并且显示得分,左后关闭窗口,服务器同时要断开连接,线程结束。在这个三个窗口中,必须要有个连接与服务器保持连接,这里我们是将其划分成一个类,并且作为是哪个窗口的一个属性,当一个窗口被销毁,另一个窗口被创建时候,这个属性就要传送个另一个窗口使用。
ExamServiceImp功能接口
IdOrPwdException异常申明
上面介绍了各个类的具体方法,接下来介绍一下各个类之间的调用和依赖关系:
下面就对上图的几个重要的类做个详细设计的说明:
1.服务器线程类
服务器的线程类,是服务器主类的一个内部类,只是作为一个服务的类,不需要对外公开,所以只是设在一个服务器类的内部,当服务器的运行到监听套接字监听客户端是否发送连接请求,程序就暂停,一直到有连接请求才会继续运行下去,程序会创建一个服务进程与之连接为之服务,只适合会运行run()方法,判断客户端发送的请求类型,来判断调用哪个方法,然后向客户端发送与之对应的数据给客户端处理。下面详细解释运行过程:
4,判断请求的类型,这个要使用到一个Request请求类里面的四个静态常量,这里使用到一个switch case语法,来匹配所要调用的方法。
5,如果静态常量是1,也就是login_request,程序就调用login()方法,login()方法,主要的就是发送学生信息和选择考试科目的链表给客户端程序,login调用完成后,就进入下一个循环,继续监听流中的数据请求。
下面就简单说一下其中用到的一些技术:
在线考试系统需要两个方面的程序开发,一个是服务器的服务开发,另一个是客户端的开发,这两个部分是分别处于两个不同的机器上运行的,也可以是在同一台机器上运行的。
对于服务器的程序设计,因为是服务器,所以必须要实现的肯定是能为多个用户进行服务,在这里也就是多个学生同时在线考试,我们这里使用的是多线程技术。
importjava.io.OutputStream;
importjava.io.OutputStreamWriter;
importjava.io.PrintWriter;
importjava.io.UnsupportedEncodingException;
importjava.util.ArrayList;
1.界面类
LogFrame登录界面
MenuFrame菜单界面
ExamFrame考试界面
Zhuce注册界面
Welcome闪屏
2.解析配置文件类
Config解析配置文件类
3.数据存放类
EntityContext封装数据到Question和User
Question存放题目信息
QuestionInfo存放题目及对应用户答案
User use =entitycontext.getuser(getid);
if(use==null){thrownewIdOrPwdException("该用户不存在!");}
if(!use.getPwd().equals(getpwd)){thrownewIdOrPwdException("密码不正确!");}
importcom.tarena.util.Config;
publicclassExamServiceImplimplementsExamService{
privateUseruser;Configcfg1=newConfig("server.properties");
EntityContextentitycontext=newEntityContext(cfg1);
另外要说一下就是,客户机通过IP地址和端口号进而与服务器之间进行连接进行数据通信。同时一个客户机只能与一个服务器进行连接,而一个服务器会与很多个客户机建立连接,服务器的每一个线程对应着一个客户机的连接的进程。
二、详细设计
前面已经介绍说,在线考试系统主要的就是两个重要的部分,服务器部分和客户机部分,另外还有一些实体类和一些工具类,下面就按照包得结构详细的介绍一下在线考试系统的设计:
计算机学院
Java
一、项目分析与设计
(一)项目技术
学生在线考试系统实现的是学生通过客户端登陆服务器完成考试的过程,在这个项目整个过程中,我们实现了服务器的一些服务程序的开发,以及客户端的程序开发,在服务器这边,我们要实现的服务器能够响应客户端发送的数据请求,并且能够分辨出发送来的是什么请求,在客户端这边,客户端要能够接受服务器发送过来的数据,并且解析成所要的数据类型,并且要能让用户可阅读,客户端与服务器的一个线程保持着连接。
4,学生交卷后,系统自动计算分数,并且以弹出消息框的形式告诉用户交卷成功,并且显示考试分数。
之后,学生只能点击退出,退出考试。
1.服务器流程图
2,客户端的Client流程图
三、运行截图
四、部分代码
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
在整个系统中,我们会涉及到两个类,一个是试卷类,另一个是学生类,试卷类中有个属性就是问题类,这两个类的信息,都是以配置文件的形式保存在文件中,我们可以使用工具类进行读取他们。
(三)设计思路
在这里我们就以服务器与客户端之间的连接为中心,简单说一下这个考试系统的搭建过程。
首先,服务器需要启动,服务器需要读取配置文件,这里我们就需要将所有的试卷题目以规定的格式写在一个配置文件中,把所有的学生信息写在另一个配置文件Leabharlann Baidu,服务器需要试卷信息,所以定义试卷类,题目类,以及学生类,因为服务器与客户机之间需要有数据的请求,而且分为多于一种的请求类型,这里我们有连接请求,发送试卷请求,答题请求,所以我们定义一个请求类,这个服务器还需要不断地从磁盘文件中读取信息,所以为了减少代码量,我们这里需要几个工具类,一个是创建套接字的连接,另一个就是读取题目配置文件的题目的工具类。这样服务器的基本框架已经出来了。
步骤:
1,首先,用户启动客户端程序,程序进入用户登录的界面,用户必须输入正确的学号和密码才能进入到选择学科的界面,如果用户的学号或者密码错误,将以弹出的对话框的形式提醒用户从新输入信息。
2,用户输入成功信息,则表示登录成功,然后就进入到选择科目的界面,用户选择所需要的考试科目,点击确定。
3,之后,用户就进入到考试界面,在窗口上回看到学生的信息,中间是选择题的第一题,可滚动面板要设置成不可操作,同时,开始时间的倒计时,学生必须在规定的时间内选择将所有的考题做完,不然,系统将会自动交卷,到时,选项将不可操作。
publicvoidsetentitycontext(EntityContext entitycontext) {
this.entitycontext=entitycontext;}
@Override
publicUser login(intgetid, String getpwd)throwsIdOrPwdException{
importjava.util.Iterator;
importjava.util.List;
importjava.util.Random;
importjavax.swing.JOptionPane;
importcom.tarena.elts.entity.EntityContext;
importcom.tarena.elts.entity.ExamInfo;
而客户端这边,我们通常就是向服务器发送请求,服务器相应我们的请求,从而完成服务器与客户端之间的通信。
在客户端与服务器之间,我们要掌握服务器的套接字编程技术和客户端的套接字编程技术。
(二)项目描述
这里主要介绍一下学生在线考试系统,学生在线考试系统主要是学生通过客户机登陆自己的账号,然后完成课程科目的考试过程,这当中没有任何纸质的试卷出现,全部都是以网路形式完成考试。
步骤:
1,在初始化init()方法中是个while()死循环,不断的监听客户机的套接字连接请求,当有连接请求的时候就继续运行。
2,新建一个服务线程,这个服务线程继承自线程类,直接调用start()方法,让服务进程直接运行起来,这样,服务线程就与客户机连接起来了。
3,服务线程首先是创建一个输出流,准备给客户机发送数据,然后就是一个while()死循环,不断地从流中读取数据,一读取到数据就要判断请求类型。另外,在服务器的控制台中,在每个用户连接过程中给服务器发送数据请求,服务器将在控制台即时输出连接请求的信息,还有用户的请求情况,这主要是显示服务器即时监控的效果。其实不输出信息也是没有关系的。
6,如果是静态常量2,就要调用begin方法,程序调用begin方法,根据发送过来的选择的课表信息,就会向客户端发送相应的考试题目,以链表的形式发送,然后就继续进入下一个循环监听。
7,如果是静态常量3,就会调用交卷信息的send()方法,这个方法不需要向客户端发送数据信息,这个请求是告诉服务器,学生考试完成,要求将分数写入到磁盘文件中,调用完成后继续监听。
相关文档
最新文档