首页 基于socket通信的在线考试系统设计

基于socket通信的在线考试系统设计

举报
开通vip

基于socket通信的在线考试系统设计安徽农业大学经济技术学院毕 论文题目 姓名 院系指导教师业论文(设计)学号专业职称中国·合肥 二o一三年六月 课题名称 学生姓名 指导教师姓名 1. 2. 3. 4. 5. 6. 7. 8.基于socket通信的在线考试系统设计宋杰陈卫专业职称网络工程课题来源学号讲师导师指定09539042研究内容Swing界面设计:使用java的Swing技术实现软件界面。I/O流:通过I/O流读取配置文件。Socket通信:使用Socket实现客户端和服务器端之间的通信。多线程:服务端使用多线程技术为多个客户端提供服务。Ja...

基于socket通信的在线考试系统设计
安徽农业大学经济技术学院毕 论文题目 姓名 院系指导教师业论文(设计)学号专业职称中国·合肥 二o一三年六月 课题名称 学生姓名 指导教师姓名 1. 2. 3. 4. 5. 6. 7. 8.基于socket通信的在线考试系统设计宋杰陈卫专业职称网络工程课题来源学号讲师导师指定09539042研究内容Swing界面设计:使用java的Swing技术实现软件界面。I/O流:通过I/O流读取配置文件。Socket通信:使用Socket实现客户端和服务器端之间的通信。多线程:服务端使用多线程技术为多个客户端提供服务。Java反射机制:使用反射机制实现方法的远程调用。Java异常控制机制:使用自定义异常提高系统的健壮性。MVC:使用MVC设计模式实现软件的分层设计。IOC:使用控制反转的思想实例化类。 研 究 计 划 特 色 与 创 新 指 导 教 师 意 见3月中3月底4月初4月中4月底5月初5月初5月中5月下调研、查资料。确定系统架构、分析并划分各功能模块的接口。各功能模块设计与开发。各功能模块及整个系统的调试与运行。撰写毕业设计论文。1.2.3.界面友好:界面UI美观,用户体验良好。系统稳定,能实现远程部署,支持多人同时在线考试。具有较强的实际应用价值。教研室意见 学 院 意 见主要领导签字: 年月日 目录 1引言·······················································································································12设计思想·················································································································23考试系统软件结构设计································································································4 3.1数据模型设计·······································································································4 3.2客户端设计·········································································································4 3.2.1控制器设计····································································································5 3.2.2服务层设计····································································································5 3.3服务端设计·········································································································7 3.3.1无连接 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 状态保持·······················································································7 3.3.1服务端网络层工具类封装·················································································94考试系统软件界面设计·····························································································105考试系统通信机制设计·····························································································11 5.1客户端通信····································································································11 5.2服务端通信····································································································116系统读取配置文件信息·····························································································137考试系统业务功能点设计··························································································13 7.1 7.2 7.3 7.4系统时间·······································································································13系统异常控制·································································································14系统读题·······································································································15考试及成绩····································································································188系统模块集成··········································································································219系统测试················································································································2210结束语·················································································································24参考文献···················································································································24致谢·························································································································24 基于socket通信的在线考试系统设计 学生:宋杰,指导教师:陈卫 (安徽农业大学经济技术学院合肥230036) 摘要:本文介绍了基于socket通信的在线考试系统设计。给出了考试系统的设计 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 和代码实现,讨论了socket通信机制、MVC软件设计模式,客户端服务器通信模式以及JAVA软件编程。本系统建立了两个JAVA工程、分别为考试客户端和考试服务器端,服务器端通过多线程机制和socket通信为多个客户端提供在线考试的功能,客户端为用户提供了可操作的界面,并使用反射机制远程调用服务端中的方法。本文还介绍如何使用属性注入的方式解决软件模块与模块之间的依赖关系。 关键词:Swing,Socket,反射机制,I/O流,多线程,异常处理,MVC,IOC1引言 网络技术是计算机领域中发展最为迅速的技术之一,它在政治、经济、生活等各个方面发挥着十分重要的作用。随着计算机网络的普及和推广,将会有越来越多的人利用网上资源,享受不断发展和完善的网络服务,以此来提高工作效率和水平。随着我国经济发展和网络的普及,网络技术也越来越多地被应用于日常工作之中。在程序设计领域,面向对象的编程技术正在逐步代替面向过程的程序设计技术,成为计算机应用设计开发的主流,尤其在网络技术开发中,面向对象的Java语言编程和相关的Java技术正在以前所未有的速度发展。网上购物、网上银行、远程教学、网络聊天、网络游戏等都开始使用Java技术。而且Java使平台无关性的思想成为现实,独立的Java程序可以被编译为与平台无关的字节码,这种字节码可以运行在任何拥有Java解释器的机器上。真正降低了企业成品和程序员的负担。 Socket(套接字)是一种基于TCP/IP的编程接口。它采用客户/服务器通信机制,使客户端和服务器端通过Socket接口在网络上实现连接和数据交换。它提供了一系列系统调用,使用户可以方便地实现TCP和UDP等多种网络协议的通信。它使用户可以在网络协议上工作而不必对该网络协议有非常深入的了解。这样编写的程序可被迅速移植到任何支持Socket的网络系统中去。 本文利用JavaSocket来实现双机通信,能够达到在一台服务器上部署服务端,在多台客户机上部署客户端,最终实现服务端能够同时为多个客户端提供在线考试的目的。在系统设计的过程,我将逐步探索Socket通信的原理和软件设计的奥秘。 1 2设计思想 在本设计中,系统分为客户端和服务端两个部分,客户端和服务端之间的通信由socket通信机制完成。客户端适应Swing技术给用户提供操作的界面,并通过java中的监听器来监听用户的操作。当监听器监听到用户的某个点击事件后,他需要实例化相应的java类,调用该实例化对象的相关方法,获取正确的响应数据,并通过界面展示给用户。在这个触发响应的过程中,将涉及对于软件设计方方面面的考虑。 首先,触发响应过程如何通过 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的软件设计模式来实现。从传统模式来看层次化的软件设计模式比较适合中小型软件的开发,所以本系统采取了MVC[1]的设计思想,将软件分为视图层,控制层,服务层,网络层和数据层。顾名思义,视图层是给用户提供操作的接口,当用户在界面上触发一个事件后,会实例化一个控制器(实例化的方式将在后面讨论),然后调用该控制器中的方法,控制器中的方法会调用相应服务层中的方法来获取数据,再显示相应的界面给用户。可以看出,控制器起到调度者的作用,他是视图层和服务层之间的桥梁,这样做的好处在于层次之间的分工明确。 那么服务层如何来获取数据呢,在整个系统中,如果按就近原则来说视图层的数据是由服务层给予的,所以,服务层是软件核心业务的执行者。但是,在客户端/服务器这样的架构中,服务层需要从远程服务器上获取数据,所以,本系统使用了socket通信机制,于是,系统加入了网络层专门用来建立客户端和服务端之间的连接,用来发送请求和获取响应数据。那么服务器是如何知道服务层想要调用哪个类中哪个方法呢,这时,有了java中的反射机制就可以迎刃而解了。在发送请求之前,服务层需要实例化一个类,这个实例化对象中包含了服务层想要调用服务器端目标类的类名,方法名和参数列表,然后服务层将该对象发送给服务器,这时系统将这个包含目标类类名,方法名和参数列表的对象叫做Request对象,并给他一个属性sessionID,用来表明这个请求的身份(借鉴BS通信方式)。在socket通信机制中,当客户端和服务端建立连接后,他们之间的通信可以通过IO流机制来实现,所以,系统将服务端实例化的Request对象通过对象输入流ObjectOutpustStream写入到网络流中,在服务器端通过对象输出流ObjectInputStream获得该对象,再使用Request对象中的类名,方法名和参数列表通过反射机制来访问数据层。这时,服务端需要将结果返回给客户端了,借鉴BS通信模式,系统定义了一个Response对象,该对象中的属性包括返回的数据,sessionId和相关异常信息,客户端在网络输出流中获得该对象,再从该对象中读取数据返回给控制器,控制器调用相应的界面显示数据给客户端,这样就完成了一次客户端与服务器端交互。 2 服务端得到客户端发送的Request对象后,将通过反射机制访问数据层中的相关方法。在传统的软件架构中,数据层是和数据库产生交互的组件,但是在本次设计中没有使用数据库来持久化数据,而是使用propertes配置文件的方法,通过FileInputStream对象和Properties对象来加载和读取数据。 最后,在前面提到了实例化方式的问题,在java中最简单的实例化方式,是在该对象被需要时通过new关键字来实现,但在整体软件架构中,如果当一个对象被需要时才实例化,那么会导致对象实例化的泛滥,从而使软件性能降低。这时借鉴在BS系统架构中有名的Spring框架能够系统的管理对象实例化的做法,他是通过IOC[2]控制反转的思想来实现的,简单概述就是实例化对象的主动权不是交给需要该对象的类,而是交给容器来管理,容器通过属性注入或者构造器注入的方式将已经实例化的对象注入到需要该对象的类的中,从而完成一次实例化多次调用的目的,这样做不仅管理了对象,也有效实现了解耦的目的。所以,在定义一个类时,如果该类依赖其他类,那么就定义该类的set方法,最后在一个公共的main方法中完成对象的组装。 具体设计思路如图2-1所示:客户端视图层 控制层 服务层 Socket通信 网络层软件界面JFrameClientContextExamServiceAgentRequestResponseExamserver 服务端服务层 数据层ExamServiceImplEntityContext 配置文件Properties 图2-1系统架构 3 3考试系统软件结构设计 3.1数据模型设计 根据实际业务需求,我抽象出了如下4个实体模型: 表3-1考试系统数据模型 UserintidStringnameStringpassword 学号名字密码编号题目选项答案分数难易度考题题号 Questionintid;Stringtitle; Listoptions;Listanswers;intscore;intlevel; QuestionInfoQuestionquestionIntquestionIndex ListuserAnswers用户答案 Examinfo StringtitleUseruserinttimeLimitintquestionCount 考试科目考生考试时间考题数量 User类提供用户登陆服务,Question类表示一道试题,数据层会将考试配置文件解析为一个Question对象集合,返回给服务层,服务层从这个试题集合中根据难易度比例随机抽取20道试题组合成一套试卷,这保证了每个考生的试题是不一样的。QuestionInfo类表示一个试卷试题对象,他将Question对象和用户选择的答案做了对应关系,这样便于在用户提交试卷后统计分数。Examinfo类为考生提供基本的考试信息,该类中的属性会通过界面显示给考生,起到在线提醒的功能。整个考试系统将围绕该4个实体模型展开。3.2客户端设计 考试系统客户端分为三层:视图层,控制层和服务层。视图层为软件界面,控制层接受用户请求,访问服务层获得响应数据,向用户返回新界面,服务层发送远程请求并 4 解析服务端的响应数据,其结构图如图3-2所示:LoginFrameMenuFrameExamFrameRuleFrame ClientContext ExamService ExamServiceAgent 图3-2服务端设计 其中ExamServiceAgent依赖Request,Response和Utils 3.2.1控制器设计 控制层包含两个类:ClientContext控制器类,ClientMain客户端启动类。控制器的功能是根据服务层返回的结果控制界面显示和关闭,以及在界面上显示什么内容。Swing技术生成的界面是通过setVisible()这个方法来控制显示的。比如说,对于视图层的LoginFrame(登陆界面)类,先将其例化后,通过loginFrame.setVisible(ture)显示界面,loginFrame.setVisible(false)关闭界面。那么在ClinetContext中就必须先实例化产生该界面类的对象,再调用该方法,但是在前面讨论过,IOC思想更适合对象的管理,所以,设计ClinetContext这个控制器时遵守的原则是:对于ClinetContext依赖的类,将该类设为控制器的私有属性,并提供get/set方法,在ClientMain客户端启动类中将控制器依赖的类全部实例化,通过set方法注入到ClinetContext中,这样就可以达到控制器无需自己实例化对象而控制多个界面的效果。 3.2.2客户端服务层设计 服务层包含了所有客户端业务组件,其中ExamService是一个接口,ExamServiceAgent是该接口的实现类,他具体实现了ExamService中定义的户登陆、初始化考试、获取上一题、下一题,保存答案,提交试卷,获取分数6个抽象方法。在服务层中,ExamServiceAgent是核心类,他能够向服务端发送请求和获取服务端响应,他是客户端和服务端的桥梁。 分析来看,ExamSerivceAgent包括如下功能: (1)读取配置文件,获得服务端的IP地址和端口号,通过Socket(ip,port)与服务器 5 建立连接。 (2)接受控制器的调用,在具体被调用的方法中构造Request对象,并将该对象写入到网络流中发送给服务端。 (3)接受服务端响应,解析响应对象Response中的数据,将数据返回给控制器。我将建立连接,发送请求,获取相应三个处理过程抽象成工具类Utils,以用户登陆为例代码片段如图3-3和图3-4 所示: 图3-3 用户登陆代码 图3-4Utils工具类代码 6 3.3服务端设计 考试系统服务端分为网络层,服务层和数据层,网络层监控客户端的连接请求,当监控到有客户端发送了连接请求后,服务端通过多线程[3]机制给该客户端分配一个考试服务对象ExamServiceImpl,并将该客户端请求对象Request中的SessionId和该ExamServiceImpl对象做键值对,最后通过HashMap[3]将该键值对存储在服务器内存中。当该客户端再次发送请求时,服务端会拿当前请求对象Request中的SessionId去查找HashMap中该SessionId所对应的ExamServiceImpl,这种机制保证了客户端在服务器上访问的考试服务对象始终是同一个。 服务端结构图3-5所示:ExamServer 多线程 ExamServiceExamService······ExamService ExamServiceImp······ExamServiceImpl 数据层 图3-5服务端设计 其中ExamServer依赖Request,Response和Utils; 3.3.1无连接协议的状态保持 本系统的客户端和服务端之间的连接状态会经历:建立连接、发送请求、接收响应、断开连接四个过程,这是一种无持续状态的连接,这种机制充分重用服务器的网络服务能力,但其缺点是不能保持持久连接,那么就需要一种机制来识别客户端是否已经来过。在传统的BS模式的架构中,浏览器访问服务器时,服务器会给本次请求分配一个SessionId,该SessionId就相当于一个令牌,浏览器每次访问都带着这个令牌,而服务器检查该令牌。在本考试系统中,我模拟了这种令牌访问机制,这种机制能保证客户端在下一次访问服务器时,能通过该SessionId找到服务器为其分配的ExamServiceImpl 7 对象,其执行 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 图3-6所示:客户端 ExamServer 获得Request 是否存在SessionId HashMap分配SessionId ExamServiceImpl ExamServer 构造 Response分配ExamServiceImpl 图3-6无连接协议状态保持设计 服务端返回的Response对象中也包含请求对象Request中SessionId,客户端获取Response对象后,会将该SessionId存入内存,这保证了客户端每次访问都带着同一块令牌。服务端通过SessionId查找服务对象和分配SessionId的代码如图3-7: 图3-7查找ExamServiceImpl或分配SessionId 8 该代码的97行就是一种IOC思想的体现,系统在网络层实例化EntityContext数据访问对象,在第一次创建ExamServiceImpl服务对象时,通过set方法将该数据访问对象注入到服务对象中,这样客户端在后继访问服务对象时只使用一个数据对象,这样可以大大节省服务器端的内存资源,这也是一个简单的单例模式。 对于SessionId的生成,我使用了java中的UUID[4]类,他能结合机器的网卡、当地时间、一个随即数来生成一个数字,它保证对在同一时空中的所有机器都是唯一的。用它来做SessionId保证了ID号的唯一性。 3.3.2服务端网络层工具类封装 在服务端,客户端的每一次请求,服务端都会按照如下流程执行: (1)网络层给该客户端分配一个服务线程; (2)获得网络流中的Request对象; (3)根据Request中的SessionId获得其对应的EaxmServiceImpl服务对象; (4)根据Request中请求参数通过反射机制[5]访问服务对象并构建Response对象; (5)将Response对象返回给客户端; 在步骤(4)中将使用反射机制访问服务对象,其具体过程包括: (1)获得被调用对象的类类型; (2)根据方法名,参数列表获得该类中的方法对象; (3)传递方法参数,调用方法; 感觉这是一个比较繁琐的过程,我将其封装成工具类如图3-8 所示: 图3-8反射机制访问对象中的方法 9 4考试系统软件界面设计 客户端主要为用户提供系统登陆和考试界面,根据业务需求,设计了5个界面模块 表4-1界面类WelcomeWindow LoginFrame MenuFrame RuleFrame ExamFrame系统启动闪屏登陆界面菜单界面考试规则界面考试界面 软件界面设计本人使用了Swing[5],Swing中有三个基本构造块:标签、按钮和文本字段;但是现在需要个地方安放它们,并希望用户知道如何处理它们。JFrame类就是解决这个问题的——它是一个容器,可以把其他组件添加到它里面,把它们组织起来,并把它们呈现给用户,所以我将LoginFrame,MenuFrame,RuleFrame,ExamFrame这三个界面类都继承JFrame类。Java中JWindow 类是一个无装饰的顶层窗口,WelcomeWindow继承该类,形成一个软件启动窗体,提高用户体验。 软件界面能够监控用户的操作,Swing给我们提供了监听器,以登陆按钮为例: 图4-1考试按钮 代码第118行创建JButton对象,并设置按钮标题;第119行设置按钮大小和在界面上的坐标,其参数含义为setBounds(宽,高,横坐标,纵坐标);第121行给登陆按钮绑定键盘回车事件;第123行开始为按钮添加监听器,我使用内部类的方式为按钮绑定控制器中的start()方法;由于在视图层依赖控制器类,运用IOC思想,我将ClientContext注入到界面类中便于监听器调用,所以在每个界面类中必须提供ClientContext的set方法。 对于界面布局的设计方式,Swing中有两种方式:(1)流式布局;(2)绝对定位。 10 由于流式布局按照东西南北的方式分割界面布局,代码臃肿繁琐,我采取了绝对定位的方式,通过设置组件在界面上坐标来进行定位。 5考试系统通信机制设计 考试系统的客户端和服务器端的通信是建立在Socket通信的基础上,但需要形成一个比较 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 的通信流程完成通信过程,在前面也谈到过客户端如何向服务端发送请求,服务端如何去响应请求的,那么这里我想完整的概述考试系统的通信机制。通信流程如图5-1所示:Socket 网络流 ServiceSocket 图5-1通信机制 5.1客户端通信 客户端通信的流程为: (1)通过newSocket(host,port)和服务端建立连接; (2)通过getOutputStream()方法从Socket对象中获得网络输入流; (3)通过writeObject()方法将Request对象写入到网络流中,刷新输入流; (4)通过getInputStream()方法从Socket对象中获得网络输出流; (5)通过readObject()方法从流中获得Response对象,关闭Socket; 代码设计请见图3-4。 5.2服务端通信 服务端通信的流程为: (1)创建ServiceSocket对象,通过accpet()方法监控服务端的Socket请求; (2)如有连接,通过getInputStream()方法从Socket对象中获得网络输出流; (3)使用readObject()方法从流中获得Request对象; (4)根据Request对象中的请求参数访问数据层 (5)根据返回的数据构建Response对象 (6)通过getOutputStream()方法从Socket对象中获得网络输入流; (7)通过writeObject()方法将Response对象写入到网络流中,刷新输入流; 11 设计代码如图5-2 所示: 图5-2服务端启动方法 在该start()方法中使用了无限循环,在该循环中ss.accept()不断监控客户端的请求,一旦有客户端请求,将给该客户端分配服务线程,其代码如图5-3 所示: 图5-3-考试服务线程 服务线程的定义系统使用了内部类的方式,其中的getService()方法请见图3-7。 12 客户端和服务端创建Socket的时机是有所差异的,客户端是当用户产生某个请求时间时才发起连接,而服务端需要在考试服务开启之前手动调用ExamServer中的start(),相当于启动服务器的概念。 6系统读取配置文件信息 本系统为了方便管理IP地址,端口号等一些可能发生改变的参数,系统使用了properties配置文件。在properties文件中,信息是通过键值对的方式来存储的,同过load方法可以将一个properties文件输出流对象载入到Properties对象中,这样可以通过getProperty(Stringkey)方法,根据建值来获取其对应的字符串参数。 为了方便读取配置文件,我定义了Config 工具类,代码如下: 图6-1配置文件工具类 7考试系统业务功能点设计 本系统涉及到的功能点比较多,从打开软件界面,到交卷,系统在代码实现上结合了很多java编程方面的知识,比如定时器,集合框架,自定义异常,IO流,时间,字符串处理等等。 7.1系统时间 一场考试是有时间限制的,所以,本系统应该具备时间提醒功能,并在考试开始时 13 计时,时限到后提醒交卷或强制交卷,startTimer 方法代码如下: 图7-1系统时间 代码235行从考试信息对象中获取这场考试的时限,并将其转化为毫秒,236行通过获取当前时间和时限计算考试结束的时间,240行获得考试剩余时间,241~243行是将剩余时间转化为时分秒,再调用界面类ExamFrame中的updateTime方法更新JLabel标签中内容,updateTime 方法代码如下: 图7-2更新界面 在startTimer方法中,使用了定时器来更新界面和时间到后强制交卷,startTimer方法的246行和252分别定义了任务执行的时间和任务过期的时间。248~251行为任务过期时执行的方法体,238~244行为定时任务的方法体。 7.2系统异常控制 系统在运行过程中可能会因为用户误操作产生运行时异常,比如用户输入的用户名 14 和密码不匹配会产生异常,需要将异常信息显示到界面以提醒用户,为此我自定义了IdOrPwdException异常,代码如图7-3 : 图7-3IdOrPwdException异常类 其中message为自定义异常信息,其他程序捕捉到该异常后会通过getMessage方法获取该异常中的message信息,服务端ExamServiceImpl类中的login方法会根据用户名和密码是否匹配判断是否抛出该异常,login代码方法图7-4 : 图7-4ExamServiceImpl中的login方法 最后在客户端控制器中通过trycatch块捕获该异常,通过getMessage方法获取异常信息,并将异常通过JLable标签显示到界面。 7.3系统读题 系统读题是考试系统的核心业务,服务端会在调用ExamServer中的start()方法时将试题配置文件中的所有试题读入内存作为一个试题库,当客户端调用startExam()方法 15 后,会从内存的题库中随机抽取20道题组成一张试卷,那么题库的存储格式至关重要,因为会影响下面选题的执行。 本人将题库设计为一个HashMap,其key为level(难以水平),value是一个Question集合,这样就可以在每个level下随机抽取若干题目了。为了方便通过IO流[6]的方式将配置文件中的试题读出,本人将试题配置文件设计为如图7-5 格式: 图7-5考试配置文件corejava.txt 通过如下代码读取配置文件: 图7-6EntityContext中的loadQuestion方法 代码79~82行是打开字符流,通过readLine()连续读出五行字符串交给paresQuestion()方法将其解析成一个Question对象,其代码如图7-7: 16 图7-7EntityContext中的paresQuestion方法 从试题配置文件中可以看出有些题目是多选项的,答案通过“/”连接,因此需要切割成一个集合,所以在paresQuestion()方法代码的第117行使用了parseAnswers()方法,代码如图7-8 : 图7-8EntityContext中的paresAnswers方法 通过paresQuestion和paresAnsers两个方法解析出Question对象后,将其存入到HashMap中,该HashMap的结构如下: HashMap>questionMap= newHashMap>(); questionMap对象的第一个参数为该Question对象的level,第二个参数为该level所对应的Question对象集合。那么将一个Question对象放入其level对应List中的流程如下: 17 (1)查询questionMap中是否有该Question的level; (2)有,则取出questionMap中该level对应的List,将Question加入 到集合中; (3)无,则创建List,将Question加入,在将level作为key,List 作为value存入questionMap中; loadQuestion方法代码实现如图7-9 : 图7-9EntityContext中的addQuestion方法 试题库形成后,存入内存,客户端发出开始考试请求后,将调用服务端ExamServiceImpl对象的startExam()方法,该方法会调用createPaper()方法,创建一套20题的试卷,这时ExamServiceImpl中peper属性将指向该试卷(QusetionInfo集合),这保证了用户下一次访问服务器时使用的是同一套试卷。随机生成试卷代码如图7-10 : 图7-10ExamServiceImpl中的createPaper方法 7.4考试及成绩 用户在考试过程中需要选择答案,点击下一题、上一题和交卷,这是一系列和服务端产生交互的过程。在服务器的内存中已经保存着和该客户端对应的ExamServiceImpl 18 对象,该对象的paper属性指向了一套试卷,paper是一个QuestionInfo集合,QuestionInfo用来保存试题Question,题号QuestionIndex和用户答案UserAnswer。所以,我们可以使用QuestionIndex属性来控制上一题或下一题的获取,使用UserAnswer保存用户答案,使用JLable标签将Question中试题信息显示到界面。 在界面中,使用监听器给上一题,下一题和提交按钮绑定控制器中的prev(),next()和send()方法,通过这个三个方法,界面可以和服务端产生交互。获取界面上用户选择的答案至关重要,通过Swing中的Option类可以获取用户选择的答案,代码如图7-11 : 图7-11ExamFrame中的getUserAnswers方法 那么用户点击下一题按钮时其执行流程如下: (1)获取当前界面试题的题号和用户选择的答案; (3)将答案保存到服务端的ExamServiceImpl的对象中paper属性中; (4)获取下一题,显示到界面; 具体代码如图7-12 : 图7-12ClinetContext中的next方法 代码第160行使用Swing中的对话框,提醒用户已是最后一题。 19 用户点击上一题按钮执行流程如下: (1)获取当前界面试题的题号和用户选择的答案; (2)将答案保存到服务端的ExamServiceImpl对象的paper属性中; (3)获取上一题QuestionInfo对象,将QuestionInfo中的Question信息显示到界面; (4)根据QuestionInfo中的userAnswers将options设置选中; 具体代码如图7-13 下: 图7-13ClinetContext中的prev方法 next()和prev()需要依赖saveUserAnswers()、getQuestion()、updataView()、updateOption()等方法,其代码见附录1。 用户点击send()交卷按钮系统执行流程如下: (1)系统弹出提示,提醒用户是否确认交卷并保存最后一题的答案和统计分数;(2)将分数保存到内存和将分数通过弹框返回给用户; (3)关闭考试界面,返回到系统菜单界面; 具体代码如图7-14: 20 图7-14ClinetContext中的send方法 Send方法依赖overExam()、saveUserAnswers()、getQuestion()、putInPapar()等方法;其中overExam()和putInPaper()方法代码见附件2。 8系统模块集成 系统客户端和服务端都需要一个启动的main方法,在客户端的main方法中完成客户端模块的集成,其主要任务是将客户端需要使用的所有对象完成实例化,并通过set方法将对象注入需要他的对象中,完成对象与对象之间的依赖关系。客户端主方法代码如图 8-1: 21 图8-1ClinetMain 服务端在主方法中完成服务层与数据层之间的依赖关系,并启动服务端的主线程,主方法代码如图 8-2: 图8-2ExamServer 客户端和服务端分别通过clientContext.showUI()和server.start()启动。9系统测试 下面测试系统是否能正常运行: (1)调用ExamServer 中的主方法,启动服务器。 图9-1服务器启动 (2)调用ClinetMain 中的主方法,启动客户端,进入登录界面。 图9-2系统登陆界面 22 (3)输入用户名:09539042,密码:1234 ,点击登录,进入系统菜单。 图9-3系统菜单界面 (4) 点击开始考试按钮,进入考试界面: 图9-4系统考试界面 (5)选择答案,点击一下题,最后交卷系统显示分数: 23 图9-5交卷界面 点击对话框中的确定按钮后,返回到系统菜单界面,用户可以点击查询成绩查看自己的成绩,也可以点击结束考试退出系统。 10结束语 到这里系统已经能够完成正常运行,能够为用户提供在线考试功能。在软件细节方面本人做了一些功能实现,比如考试界面上的按钮,当显示第一题时,系统能够将“上一题“按钮设置为不可用,显示最后一题时,将“下一题”按钮置为不可用。此外,用户在点击“上一题”和“下一题”时,希望用户能够看到当前界面试题的题号,那么我在考试界面的左下角设置了试题编号,能够更具用户的翻题动态变化。本人所做的这些考虑目的是希望提高软件的用户体验。 当然,在整个系统设计中也有存在一些缺陷,由于系统的数据层本人没有使用数据库,在数据持久化方面,系统显得比较笨拙。但是读取配置文件的方式也有其好处,使系统很轻便,不依赖环境,部署起来非常的方便。 通过这次毕业设计,我对java软件设计,Socket通信等方面的知识有了更加深刻的了解,我想这次毕业设计在我未来的职业生涯中将会有积极的影响。 参考文献 24 [1]MVC李刚.基于WebWork核心的MVC开发[M].北京:电子工业出版社,2009:5-1. [2]IOCCraigWallsRyanBreidenbach.SpringinAction[M].北京:人民邮电出版社,2008:10-1. [3]HashMap(美)缅因.数据结构Java语言描述[M].北京:机械工业出版社,2007:7-1. [4]UUID [5]SwingBruceEckel.ThinkinginJava(4thEdition)[M].北京:机械工业出版社,2007:6-1.Marinacci.SWINGHACKS[M].北京:清华大学出版社,2007:7-1. [6]IO流BruceEckel.ThinkinginJava(4thEdition)[M].北京:机械工业出版社,2007:6-1.致谢 在这四年的学习生活中,学校严谨的治学作风、良好的学习氛围、老师们认真的工作态度,都给我留下了非常深刻的印象。在这里我真诚地向那些曾经帮助过我、关心过我的老师、同学和朋友们说一声:谢谢!祝愿他们一生平安! 特别是在我的整个毕业设计的制作过程中,得到了陈卫老师的细心指导和关怀。在此,我特别向她表示我衷心的感谢! 附录 1 SaveUserAnswers 方法 getQuestion方法 25 updataView 方法updateOption方法 附录 2 overExam方法 26
本文档为【基于socket通信的在线考试系统设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_594905
暂无简介~
格式:doc
大小:731KB
软件:Word
页数:27
分类:互联网
上传时间:2017-05-31
浏览量:16