在线考试系统JAVA
基于JavaEE技术的在线考试系统的设计与实现的研究报告

基于JavaEE技术的在线考试系统的设计与实现的研究报告随着互联网的普及和教育信息化的发展,在线考试系统已经成为一种常见的教育衍生应用,极大地方便了教育工作者和学生的交流与互动。
本文旨在讲述如何使用JavaEE技术设计一个高效、稳定和可扩展的在线考试系统。
1.系统设计在线考试系统主要由两个部分组成:前端和后端。
前端是用户面向的界面,主要包括登录、注册、答题、提交等模块;后端是系统的核心,包括题库管理、试卷生成、考试管理、成绩统计等模块。
系统采用B/S模式架构,使用JavaEE技术实现。
前端基于JSP、HTML、CSS和JavaScript技术;后端采用Spring框架、Hibernate框架和MySQL数据库。
2.系统实现2.1 前端实现前端采用Bootstrap框架设计并实现,可以在不同终端上自适应,保证了用户使用的舒适度。
在登录模块实现中,使用Ajax技术,当用户输入用户名和密码后,系统可以实时对用户进行验证,同时对非法输入进行提示。
在答题模块中,根据用户的选择和回答情况进行动态更新界面,可以提升用户体验。
在提交模块中,使用HttpURLConnection技术实现向后端服务器发送数据,保证数据的安全性。
2.2 后端实现后端采用Spring框架,实现了IoC、AOP和MVC的思想,使系统解藕、可扩展性更强。
在控制层中,使用Restful风格设计接口,保证系统的可维护性和易扩展性。
在业务层中,使用Hibernate框架实现了检索、持久化和事务管理,提升系统效率和数据安全性。
在数据访问层中,使用MySQL数据库,在设计表结构时,采用了优化的范式,保证数据一致性和完整性,并使用索引优化查询,提高查询效率。
3.系统测试在系统开发和完善的过程中,我们使用Junit对各个模块进行单元测试和集成测试,保证系统的正确性和稳定性。
在最终测试过程中,我们邀请了多个用户进行测试,收集用户反馈,针对用户需求进行改进,使系统更加易用和用户友好。
基于Java的在线考试系统设计与实现

基于Java的在线考试系统设计与实现目录一、内容综述 (2)1.1 背景与意义 (3)1.2 研究目标与内容 (3)二、系统需求分析 (4)2.1 功能需求 (5)2.2 性能需求 (6)2.3 安全性需求 (7)三、系统设计 (9)3.1 系统架构设计 (9)3.2 数据库设计 (10)3.3 前端界面设计 (12)3.4 后端逻辑设计 (13)四、系统实现 (14)4.1 前端页面实现 (16)4.2 后端逻辑实现 (16)4.3 数据库操作实现 (18)4.4 安全性实现 (19)五、系统测试 (21)5.1 测试计划与方法 (22)5.2 测试过程与结果 (23)5.3 缺陷分析与修复 (24)六、系统部署与维护 (25)6.1 系统环境搭建 (26)6.2 系统部署过程 (27)6.3 系统维护与升级 (28)七、总结与展望 (30)7.1 工作成果总结 (31)7.2 存在问题与改进方向 (32)一、内容综述该在线考试系统旨在提供一个集中化、模块化的平台,以便教师、学生和考试管理者能够轻松地创建、管理、执行和评估在线考试。
系统核心功能包括但不限于创建试卷、管理题库、分配试题、组织考试、自动评分和生成报告等。
这些功能确保了在线考试的完整流程得以高效执行。
系统设计的重点在于用户体验和安全性,用户界面设计友好,操作简单直观,满足不同用户的操作习惯和需求。
系统采用先进的加密技术和访问控制机制,确保考试数据的机密性、完整性和安全性。
考生需要在安全的环境下完成考试,防止任何形式的作弊行为。
该系统的可扩展性和可维护性也是设计重点之一,系统架构采用模块化设计,以便根据实际需求进行灵活调整和优化。
系统代码遵循良好的编程规范,易于维护和升级。
在实现方面,系统主要使用Java开发语言进行编程,结合Spring 框架、MySQL数据库等技术实现系统的各项功能。
系统不仅支持PC端的使用,也兼顾移动端的需求,以实现跨平台的无缝衔接。
java在线考试系统课程设计

java在线考试系统课程设计一、课程目标知识目标:1. 理解Java语言面向对象编程的基本概念,掌握类的定义、属性和方法的创建与调用。
2. 学会使用Java集合框架处理数据,掌握异常处理机制。
3. 掌握Java在线考试系统的需求分析、功能模块划分和数据库设计。
技能目标:1. 能够运用所学知识独立设计并实现一个Java在线考试系统。
2. 通过实际操作,提高问题分析、系统设计和编程实现的能力。
3. 学会使用Java开发工具(如Eclipse)进行项目开发,培养良好的编程习惯。
情感态度价值观目标:1. 培养学生团队协作精神,提高沟通与协作能力。
2. 增强学生对Java编程的兴趣,激发主动学习的热情。
3. 培养学生面对问题时的积极态度,勇于克服困难,提高解决问题的能力。
课程性质:本课程为实践性较强的课程,旨在通过Java在线考试系统项目的设计与实现,让学生掌握Java编程的基本知识和技能,提高实际项目开发能力。
学生特点:学生已具备一定的Java基础,具有较强的学习能力和探究精神,但实际项目经验不足。
教学要求:注重理论与实践相结合,充分调动学生的主观能动性,培养其独立思考和解决问题的能力。
通过项目实践,使学生能够将所学知识应用于实际项目中,提高编程技能和团队协作能力。
同时,关注学生情感态度价值观的培养,激发学习兴趣,为其未来的学习和发展奠定基础。
二、教学内容1. Java面向对象编程基础:- 类与对象- 继承与多态- 抽象类与接口- 异常处理2. Java集合框架:- List、Set、Map接口及其实现类- 集合的遍历与操作3. 数据库设计:- 数据库基本概念- SQL语句编写- JDBC连接数据库4. Java在线考试系统设计与实现:- 系统需求分析- 功能模块划分- 数据库设计- 界面设计- 业务逻辑实现5. 项目实践:- 分组合作,明确分工- 项目进度安排与监控- 编码规范与代码审查- 系统测试与优化教学内容根据课程目标进行科学性和系统性的组织,涵盖Java面向对象编程、集合框架、数据库设计和项目实践等方面。
基于Java的在线考试系统的设计与实现

基于Java的在线考试系统的设计与实现一、引言随着互联网的快速发展,在线教育逐渐成为一种主流的学习方式。
在线考试系统作为在线教育的重要组成部分,为学生提供了更加便捷、高效的考试方式。
本文将介绍基于Java语言开发的在线考试系统的设计与实现,包括系统架构设计、功能模块划分、技术选型等方面的内容。
二、系统架构设计在线考试系统主要包括前台用户界面和后台管理界面两部分。
前台用户界面用于学生进行考试操作,包括查看考试信息、答题、提交答卷等功能;后台管理界面用于管理员管理考试信息、题库、成绩等数据。
系统采用B/S架构,前端使用HTML、CSS、JavaScript进行开发,后端采用Java语言编写。
三、功能模块划分1. 用户模块学生用户:注册、登录、修改密码等功能管理员用户:登录、管理考试信息、题库等功能2. 考试模块考试信息管理:发布考试、编辑考试信息题库管理:添加题目、编辑题目信息考试安排:安排考试时间、地点等信息3. 答题模块在线答题:学生在线答题,支持单选题、多选题、填空题等类型答卷提交:学生提交答卷,系统自动批改并生成成绩4. 成绩查询模块学生成绩查询:学生可以查看自己的考试成绩统计分析:管理员可以查看整体考试情况,进行成绩统计分析四、技术选型1. 前端技术HTML/CSS/JavaScript:实现页面布局和交互效果Bootstrap:提供响应式布局,适配不同设备屏幕2. 后端技术Java语言:作为后端开发语言,处理业务逻辑Spring框架:提供依赖注入和AOP支持Spring MVC:实现MVC架构,处理请求和响应MyBatis:用于数据库操作,提供ORM映射3. 数据库MySQL:存储用户信息、考试信息、题库等数据五、系统实现流程确定需求:明确系统功能需求和用户交互流程设计数据库表结构:创建数据库表,设计表之间的关联关系搭建后端框架:使用Spring框架搭建后端业务逻辑处理框架开发前端页面:使用HTML/CSS/JavaScript开发前端页面,并与后端接口对接实现功能模块:按照功能模块划分,逐步实现各个功能模块测试与优化:进行系统测试,修复bug并进行性能优化六、总结与展望通过本文对基于Java的在线考试系统的设计与实现进行介绍,我们可以看到,在线考试系统能够为学生提供便捷高效的考试方式,同时也为教育机构提供了更加智能化的管理手段。
基于Java的在线考试系统设计与实现

基于Java的在线考试系统设计与实现一、引言在线考试系统是一种以互联网为基础,通过网络技术实现的考试工具。
它能够提供便捷的考试方式,方便学生进行考试,并能快速地生成考试结果。
本文将介绍基于Java语言设计与实现的在线考试系统的开发步骤和实施过程。
二、系统设计1. 系统需求分析在线考试系统需要满足以下需求:- 学生注册与登录:提供学生注册和登录功能,确保用户信息的安全性。
- 考试管理:包括试题管理、试卷生成和考试安排等功能。
- 考试过程:提供在线答题、计时和提交等功能。
- 阅卷与评分:自动化批改试卷,并生成考试成绩和评价。
- 数据统计与分析:对考试成绩进行统计分析,为教师提供参考。
2. 系统架构设计基于Java语言的在线考试系统可以采用三层架构:- 表现层:使用Java Servlet和JSP技术实现用户界面和交互逻辑。
- 业务层:实现系统的业务逻辑,包括用户管理、试题管理等功能。
- 数据访问层:通过Java JDBC技术与数据库进行数据的读写操作。
3. 数据库设计本系统将使用MySQL作为数据库,设计以下几张表:- 学生表:存储学生的基本信息。
- 试题表:存储系统中的试题信息。
- 试卷表:存储生成的试卷信息。
- 成绩表:存储学生的考试成绩和评价信息。
三、系统实现1. 用户注册与登录用户注册时需要输入学生信息,并进行信息校验,确保数据的完整性与准确性。
学生注册成功后,可以使用注册时填写的用户名和密码登录系统。
2. 考试管理教师可以添加、修改和删除试题,为每个试题设置分值和难度等级。
教师还可以根据课程设置试卷,选择试题并生成试卷。
试卷可以根据学生的学习情况自动生成。
3. 考试过程学生登录系统后,可以选择要参加的考试,并开始作答。
系统会自动对学生的答题时间进行计时,并在规定时间内自动提交试卷。
4. 阅卷与评分系统采用自动化阅卷的方式,根据事先设定的答案进行批改,并计算学生的得分。
系统还可以根据试卷的难度和学生的得分情况生成考试评价。
在线考试系统需求规格说明书精选全文完整版

可编辑修改精选全文完整版在线考试系统系统需求规格说明书版本:1.0说明:本说明书仅供参考,严禁抄袭!变更记录目录1.简介 (5)1.1开发背景 (5)1.2目的 (5)1.3业务范围 (5)1.4参考文档 (5)2.约束及假定 (6)2.1 软件运行环境以及技术约束 (6)2.1.1 软件约束 (6)2.1.2 资产约束 (6)2.2 交付及部署约束 (6)3.功能性需求 (7)3.1 系统功能简介 (7)3.2 需求描述 (7)3.2.1学生端 (7)3.2.2教师端 (7)3.2.3 参考界面设计 (9)4.非功能性需求 (12)4.1 性能 (12)4.2 可扩展性 (12)4.3 可用性 (12)4.4 安全性 (12)4.5 易用性 (13)5.数据库设计 (14)1.简介1.1开发背景系统名称:在线考试系统[以下简称ZXKS系统];本项目的任务提出者是某学校。
开发者为QG公司;系统用户是使用此系统的工作人员;本项目是某学校教务管理系统平台的一部分。
1.2目的本文档定义了ZXKS系统的详细需求,明确了ZXKS系统的功能内容、功能边界、开发途径。
1.3业务范围在线考试系统用来支持在线考试,实现教师出题、学生在线考试以及相关的系统维护功能。
在线考试系统是一个web应用形式,可以通过互联网进行访问。
1.4参考文档2.约束及假定2.1 软件运行环境以及技术约束2.1.1 软件约束ZXKS系统采用Java技术进行开发。
开发及运行的软件环境为:●Java开发包JDK:jdk-1_5_0_01-windows版●应用服务器Tomcat:jakarta-tomcat-5.0.16●数据库SQL Server2005 或MySQL●开发框架:MVC(JSP+Servlet+JavaBean)2.1.2 资产约束Web服务器及数据库服务器均采用Intel P4(1.8G HZ)PC 工作站。
内存1024M、硬盘120G。
基于java的在线考试系统的设计与实现

基于java的在线考试系统的设计与实现1.系统概述。
本系统是基于Java的在线考试系统,考试系统需要记录学生的考试成绩、试题库的管理、学生的注册登录以及管理员对考试系统的管理。
本文将详细介绍在线考试系统的设计与实现。
2.系统架构。
系统采用B/S模式,前端使用HTML、CSS、JavaScript等技术实现,后端采用Java实现,使用MySQL作为数据库管理系统。
3.功能需求分析。
(2)学生登录功能:学生可以通过学号和密码登录到系统中。
(3)学生考试功能:学生可以在规定的时间内进行考试,考试中每道题目都有指定的答题时间,学生可以多次更改答案直到提交考试。
(4)考试结果管理功能:系统会根据学生的考试结果生成成绩报告,管理员可以查看学生的考试成绩。
(5)试题库管理功能:为了保证考试难度,系统需要有一套完整的试题库管理机制,管理员可以分类管理试题,同时可以进行试题的添加、删除等操作。
(6)考试成绩管理功能:管理员可以对学生的考试成绩进行管理,包括成绩查询、成绩录入、成绩修改和成绩删除等操作。
4.系统实现。
(1)数据库设计。
学生表、试题库表、考试记录表、考试成绩表、管理员表五个数据库表。
(2)学生注册和登录模块。
(3)考试模块。
考试模块中有多个考试题目,每个考试题目都有一个指定的答题时间。
考生可以多次更改答案直到提交考试。
提交考试后,系统会对学生的答案进行判分,然后生成成绩报告。
(4)试题库管理模块。
考试系统需要一套完整的试题库管理机制,管理员可以分类管理试题,并可以进行试题的添加、删除和修改等操作。
(5)考试成绩管理模块。
管理员可以对学生的考试成绩进行管理,包括成绩查询、成绩录入、成绩修改和成绩删除等操作。
5.系统部署。
本系统需要安装Java开发环境、MySQL数据库系统和Tomcat容器,其中MySQL数据库系统需要安装MySQL Workbench进行可视化管理。
6.系统测试。
系统测试分为单元测试和集成测试。
Java实现的在线考试系统的设计与开发

Java实现的在线考试系统的设计与开发一、引言随着互联网的快速发展,在线教育已经成为一种越来越受欢迎的学习方式。
在线考试系统作为在线教育的重要组成部分,为学生提供了更加便捷和灵活的考试方式。
本文将介绍如何使用Java语言来设计和开发一个功能强大的在线考试系统。
二、系统需求分析在设计和开发在线考试系统之前,首先需要对系统的需求进行分析。
在线考试系统通常包括以下几个核心功能: 1. 用户管理:包括学生、教师和管理员等不同角色的用户管理; 2. 试题管理:包括试题的增删改查、试题分类等功能; 3. 考试管理:包括考试安排、考试监控等功能; 4. 成绩管理:包括成绩统计、成绩查询等功能; 5. 系统管理:包括系统设置、日志管理等功能。
三、系统设计1. 技术选型在设计在线考试系统时,我们选择使用Java语言作为开发语言,结合Spring框架进行开发。
同时,使用MySQL数据库存储数据,前端采用HTML、CSS和JavaScript技术实现页面展示。
2. 系统架构在线考试系统采用典型的三层架构,包括表现层、业务逻辑层和数据访问层。
表现层负责与用户交互,业务逻辑层负责处理业务逻辑,数据访问层负责与数据库交互。
3. 数据库设计根据系统需求分析,设计数据库表包括用户表、试题表、考试表和成绩表等。
通过合理的数据库设计可以提高系统的性能和扩展性。
四、系统开发1. 用户管理模块开发用户管理模块包括用户注册、登录、权限管理等功能。
通过使用Spring Security框架可以实现用户认证和授权功能。
2. 试题管理模块开发试题管理模块包括试题的增删改查、试题分类等功能。
通过使用MyBatis框架可以方便地操作数据库。
3. 考试管理模块开发考试管理模块包括考试安排、考试监控等功能。
通过使用定时任务框架Quartz可以实现考试定时开始和结束功能。
4. 成绩管理模块开发成绩管理模块包括成绩统计、成绩查询等功能。
通过使用JFreeChart可以实现成绩报表生成功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目 在线考试系统1、 实验目的①熟练运用JAVA 开发环境及工具、并用JAVA 语言编写程序; ②掌握面向对象的概念;③掌握系统功能模块的合理划分,并实现各模块接口的连接; ④掌握C/S 结构的编程方法; ⑤设计数据库模型。
2、 实验内容①编辑生成试题库,随机生成本次考试试题,同时提供在线评分并保存结果。
②选择ACCESS 作为后台的数据库。
3、 实验过程3.1 系统模块部分设计题库管理:用于对单个试题的增、删、改、查等基本维护,还可对题库进行数据备份和数据还原。
我们针对不同题型、不同应用范围及不同科目对试题进行维护。
试卷管理:可进行三种组卷方式的维护:随机组卷、人工组卷、综合组卷。
还可对考生的基本信息进行维护。
考试管理:对考试分配试卷,并对考试的基本信息进行维护。
相当于人工安排考试的过程评卷管理:对试卷的客观题分配评卷人,并对评卷人基本信息进行管理。
成绩管理:对每次考试的学生成绩的基本信息进行维护,并提供学生成绩的统计管理。
用户管理:对使用本系统的用户基本信息进行维护,用户多数为:系统管理员、老师、教务处人员、其他权限管理:对系统的访问权限进行管理,并对用户可进行权限的分配。
系统应该具备的基本功能 各模块需完成以下功能:在线考试系统信息管理评卷管理试卷管理题库管理成绩管理考试管理用户管理权限管理题型维护:对试题的题型进行增、删、改、查操作。
在操作之后会自动刷新主页,以使信息更新。
范围维护:对试题的应用范围进行增、删、改、查操作。
在操作之后会自动刷新主页,以使信息更新。
科目维护:对试题的科目进行增、删、改、查操作。
在操作之后会自动刷新主页,以使信息更新。
试题维护:对试题的基本信息进行增、删、改、查操作。
在操作之后会自动刷新主页,以使信息更新。
其他维护:对试题信息的批量查询,并可进行数据导出、数据备份、数据恢复。
随机组卷:用户只需对试卷题型进行设置就可组卷的方式。
人工组卷:可使用户选择试卷的题型中的试题的组卷方式。
综合组卷:是随机组卷与人工组卷的混合组卷方式,即用户对某一类型的试题可进行选择,也可对试题不进行选择。
试卷其他维护:对试卷信息的批量查询,对试题的数据备份与还原。
考试信息维护:对考试的时间、地点、监考人、考试用的试卷、试卷总分数及答卷总时间等考试的基本要素进行设置。
考生信息维护:对考试的学生的基本信息进行增、删、改、查操作,在操作之后会自动刷新主页,以使信息更新。
分配评卷人:对考试所用试卷的客观题分配评卷人,并对评卷的基本信息进行维护。
评卷人评卷:对分配试卷的评卷人可以在此进行评卷。
考生成绩维护:对考试的考生成绩信息进行统计与汇总,对有权限的人可进行成考试管理 考试信息维护 分配评卷人 评卷管理 成绩管理 评卷人评卷 考生信息维护 考生成绩维护 成绩其他维护 题库管理 试卷管理 试卷其他维护 试卷信息维护 其它 维护 试题 维护 基本 维护 综合组卷 人工组卷 随机组卷 题型维护 科目维护 范围维护绩的增、删、改、查操作。
成绩其他维护:对考生成绩信息的批量查询,并可进行数据导出、数据备份、数据恢复。
用户基本信息维护:对使用本系统的用户进行维护,而用户的权限由权限管理进行维护,并分配给用户,使用户只能访问自己拥有的权限内。
权限信息维护:对基本的权限进行维护,用户可自定义维护权限。
用户分配权限:对未分配权限的用户进行权限的分配,即对 分配权限的增、删、改、查操作。
信息基本维护:我们的信息除了有关考试的信息外,还有公告、新闻、留言信息需要我们维护,其中公告、新闻由后台有权限的人进行增、删、改、查操作,而留言是由前台的用户(学生)或游客录入的,我们要防止垃圾数据显示,即对留言有权更改等操作。
3.2系统结构图○1、本系统分为学生前台子系统和考试管理子系统,整个系统的结构图如下:3.3 数据库设计在线考试系统考生前 台后台管 理题库管理评卷管理 考试管理试卷管理成绩管理用户管理权限管理 学生登陆用户管理 权限管理 信息管理权限信息维护 用户基本信息 信息基本维护 用户分配权限试题类型表(questionType_table):其中包括了试题的类型的基本信息,如类型名称、答题方式、说明信息等字段;录入时,我们将答题方式确定为大概几种类型:填空方式,选择方式,问答方式,判断方式,综合方式。
试题范围表(questionBound_table):用于控制试题应用的范围,如同样的科目语文,在小学、初中、高中、大学都有,由此我们设定了此表,此表中有范围名称、范围说明等基本信息;所属科目表(questionSubject_table):用于录入试题相关的科目应用,它可以有不同的应用范围。
如上所述,我们只需录入一次的科目,就可方便我们在录入试题时每次都录。
各种题库表:我们采用一种类型的题存储在一个表中,由此我们会有填空题表(question_blanc_table)、单选题表(question_selectone_table)、多选题表(question_selectMany_tabel)一题多问表(question_askone_table)、一题多问表(question_askMany_table)、判断题表(question_judge_table)等试题表试卷表(exam_table):用于报存考试中试卷的基本信息,如出卷方式(有随机出卷、人工出卷、综合出卷)、试卷名称、试卷应用范围(与试题范围相对应)、试卷所属科目(与试题科目相对应)、试题标题级别、试题标题内容、试题总类型、试题个数、试题总ID等基本信息。
学生表(student_table):用于保存学生的考试的用户名及登陆密码。
成绩表(grade_table):用于存储学生的考试成绩。
评题表(appraiser_question_table):对于主观题的答案我们须要评卷人(有权限的用户)进行手工评卷,本表用来存储评卷人评卷的一些信息。
答案表(student_answer_table):用于存储学生问答题的答案,如试卷ID,学生ID及各种试题类型的答案字段。
用户表(user_table):用于保存用户的登陆的基本信息及分配的权限。
权限表(purview_table):用于存储用户组织的的权限,通过分配操作模块的权限组织权限。
4、关键代码及其分析4.1----------------ServerGui.java------------------public void actionPerformed(ActionEvent e) {if (e.getSource() == log) {// boolean b=login();String username = JOptionPane.showInputDialog(this, "请输入用户名","输入用户名", JOptionPane.QUESTION_MESSAGE).trim();String password = JOptionPane.showInputDialog(this, "请输入密码","输入密码", JOptionPane.QUESTION_MESSAGE).trim();if (username == null || password == null) {username = "temp";password = "temp";return;}adminCheck(username, password);// 验证管理员if (tf == true) {JOptionPane.showMessageDialog(thi s, "登陆成功!", "成功",RMATION_MESSAGE);toolBar1.setVisible(true);split_one.setVisible(true);} else {JOptionPane.showMessageDialog(thi s, "登陆失败!", "失败",JOptionPane.ERROR_MESSAGE);return;}} else if (e.getSource() == setCount) {userCount = JOptionPane.showInputDialog(this, "请输入本次考试的人数");inittest(); // 数据库信息初始化} else if (e.getSource() == startSer) {if (settime == true && setcount == true) {new ServerManager();serArea.append("服务器已启动\n预设考试人数为:" + userCount + "\n考试时间为:"+ timeCount + "\n");start = true;} else {JOptionPane.showMessageDialog(thi s, "你还没有设置考试信息", "警告信息",RMATION_MESSAGE);}} if (start == true){linkArea.append(ServerManager.linkShow(ServerManager.linkstatu s)+ "\n");} else {JOptionPane.showMessageDialog(thi s, "服务器还没有启动不能进行操作", "警告信息",RMATION_MESSAGE);}} else if (e.getSource() == userButton) {if (start == true){userArea.append(ServerManager.userShow(erstatu s)+ "\n");userArea.append(ServerManager.cou ntShow(ServerManager.ucount));} else {public void adminCheck(String s1, String s2)ConnectBean cb=new ConnectBean();if (!cb.openConnection()) {System.out.println("连接数据失败");System.exit(1);return;}4.2-----------------Server_login.java----------------- // 定义一个接收用户登陆的类public void run() {String s = null;try {s = in.readUTF(); // 接收考试号和密码,然后分别取出StringTokenizer st = new StringTokenizer(s, ",");if (st.hasMoreTokens()) {str1 = st.nextToken();str2 = st.nextToken();System.out.println("username :" + str1);System.out.println("password :" + str2);}} catch (IOException e) {e.printStackTrace();}// 读取数据库里的用户信息并进行验证try {ConnectBean cb = new ConnectBean();if (!cb.openConnection()) {System.out.println("连接数据失败");System.exit(1);return;}cb.createPreparedStatement("selec t flag from stuinfo where sno='"+ str1 + "'ResultSet r = cb.executeQuery();String m ="";while (r.next()) {m=r.getString("flag");}System.out.println("标识:"+m);if ( !m.equals("0") ) {out.writeUTF("用户已经完成考试,不能再考试");} else {cb.createPreparedStatement("select sname,spass from stuinfo where sno='" + str1+ "'", false);ResultSet rs = cb.executeQuery();while (rs.next()) {dbn = rs.getString("sname");dbp =rs.getString("spass");System.out.println("用户: " + str1 + " 你的用户名为:" + dbn+ ", 你的密码为:" + dbp);}// 验证用户密码,如果登录成功将登录标志设为1if(str2.equals(dbp.trim())) {out.writeUTF("用户 " + dbn + " 登陆成功");System.out.println("用户 " + dbn + " 登陆成功");out.close();String sql1 = "update stuinfo set flag = '1' where sno= '"+str1+"'";PreparedStatement ps = cb.createPreparedStatement(sql1);ps.executeUpdate();System.out.println("用户成功登录");}else {out.writeUTF("密码错误");System.out.println("登陆密码错误");out.close();}cb.close();4.3-----------------ServerManager.java----------------public ServerManager() {Thread td1 = new Thread() {public void run() {serstatus= "login thread start!\n";serShow(serstatus);ServerSocket ss1 = null;Socket you = null;int port1 = 8001;try {ss1 = new ServerSocket(port1);serstatus = "listener the port:" + port1;serShow(serstatus);} catch (IOException e) {e.printStackTrace();}while (true) {try {you = ss1.accept();} catch(IOException e) {e.printStackTrace();}if (you != null) {counter++;ucount = "现在参加考试的人数为:" + counter;countShow(ucount);if (counter < Maxcount) {userstatus= "user's IP" + you.getInetAddress()+ " connected " + port1 + "进行登陆";userShow(userstatus);// 第一个线程启动new Server_login(you).start();} else {userstatus = "user's IP" + you.getInetAddress()+ " connected " + port1 + "中断线程启动";userShow(userstatus);// 中断线程启动new Maxcounter(you);};td1.start();// 启动一个响应客户端读取试题的线程Thread td2 = new Thread("two") {public void run() {serstatus= "thread 2 start!";serShow(linkstatus);ServerSocket ss2 = null;int port2 = 8002;try {ss2 = new ServerSocket(port2);linkstatus = "listener the port:" + port2;linkShow(serstatus);} catch (IOException e) {e.printStackTrace();}while (true) {Socket you2 = null;try {you2 = ss2.accept();} catch (IOException e) {e.printStackTrace();}if (you2 != null) {userstatus ="user's IP" + you2.getInetAddress()+ " connected " + port2 + "进行读题";userShow(userstatus);newServer_readTest(you2).start();}}}};td2.start()// 启动一个接收用户答应并存储的线程Thread td3 = new Thread("three") {ServerSocket ss3 = null;int port3 = 8003;public void run() {serstatus="thread 3 start!";serShow(serstatus);try {ss3 = new ServerSocket(port3);linkstatus="listener the port:" + port3;linkShow(linkstatus);} catch (IOException e) {e.printStackTrace();}while (true) {Socket you3 = null;try {you3 = ss3.accept();} catch (IOException e) {e.printStackTrace();}if (you3 != null) {userstatus="user's IP" + you3.getInetAddress()+ " connected " + port3 + "提交答案";userShow(userstatus);// 第3个线程启动newServer_readScore(you3).start();}}}};td3.start();// 启动一个用户查询的线程Thread td4 = new Thread("four") {ServerSocket ss4 = null;int port4 = 8004;public void run() {serstatus="thread 4 start!";serShow(serstatus);try {ss4 = new ServerSocket(port4);linkstatus="listener the port:" + port4;linkShow(linkstatus);} catch (IOException e) {e.printStackTrace();}while (true) {Socket you4 = null;try {you4 = ss4.accept();} catch (IOException e) {e.printStackTrace();}if (you4 != null) {userstatus="user's IP" + you4.getInetAddress()+ " connected " + port4 + "进行查询";userShow(userstatus);4.4-------------Server_readTest.java----------------public void run() {String sql2; // 定义查询语句String dbt = "以下为试题"; // 试题String ts = null; // 接收用户发送的考试科目int tcount = 0; // 试题的数目try {// 网络连接部分out.writeUTF("你连接成功");ts = in.readUTF();System.out.println(ts);// 数据库连接部分// 查询客户端所选试题ConnectBean cb = new ConnectBean();if (!cb.openConnection()) {System.out.println("连接数据失败");System.exit(1);return;}//在数据库选题sql2 = "select * from exam where eid='" + ts + "'";cb.createPreparedStatement(sql2, false);ResultSet rs = cb.executeQuery();while (rs.next()) {dbt += "^"+"\n"+rs.getString(2) +"\t" + "\n" + rs.getString(3) +" ^";tcount++;}cb.close();System.out.println(dbt);System.out.println(tcount);out.writeUTF(Integer.toString(tco unt));out.writeUTF(dbt); // 将读到的试题返回到客户端//传送考试时间out.writeUTF(""+Timecount);out.flush();out.close();System.out.println("读取试题成功!!");} catch (SQLException e) {e.printStackTrace();System.out.println("not connect db");} catch (IOException e1) {System.out.println("not read client select!");}}4.5--------------/Server_readScore.java------------------// 定义一个接收用户答案的类,判断对错,将分数返回到用户端,并将成绩存入数据库public Server_readScore(Socket socket){// ----------------------创建网络连接----------------------------------// this.socket = socket; .........public void run() {// ------------------------- 接收用户提交的答案---------------------------//try {readkey = in.readUTF();System.out.println(readkey);} catch (IOException e1) {e1.printStackTrace();}StringTokenizer stc = new StringTokenizer(readkey, ",");if (stc.hasMoreTokens()) {// 客户传来答案的第一个字符为用户名,第二个字符为考试科目str1 = stc.nextToken().trim();System.out.println("用户为:" + str1);uno = Integer.parseInt(str1);}if (stc.hasMoreTokens()) {//第二个字符为考试科目str2 = stc.nextToken().trim();System.out.println("试题类型为:" + str2);}................//------------------------------在数据库获取正确答案-------------------------//try {ConnectBean cb = new ConnectBean();if (!cb.openConnection()) {System.out.println("连接数据失败");System.exit(1);return;}..............}// ------------------------判断分数---------------------------------//for (int i = 0; i <Integer.parseInt(str4); i++) {if(userAnswer[i].equals(crreAnswer[i])) {count += 10;}}System.out.println("用户:" + str1 + ",你的得分为:" + count);// 将分数返回到客户端try {out.writeUTF(Integer.toString(cou nt));System.out.println("将分数返回到客户端");out.flush();out.close();} catch (IOException e) {e.printStackTrace();}// ------------------------将分数存到数据库------------------------------//try {ConnectBean cb = new ConnectBean();if (!cb.openConnection()) {System.out.println("连接数据失败");System.exit(1);return;}PreparedStatement ps = cb.createPreparedStatement(subject);ps.setInt(1, count);ps.setInt(2, uno);ps.executeUpdate();System.out.println("更新成功");mit();cb.close();} catch (SQLException e) {// TODO 自动生成 catch 块System.out.println("写入数据发生错误!!!/n" + e);}}4.6-------------------------Server.java----------------------............public static void main(String args[]){new Server();.........}}4.7--------------------TestGui.java-------------------public void actionPerformed(ActionEvent e) {if (e.getSource() == callIP) { // 呼叫服务器 if (socket != null && in != null && out != null) // 消除以往的连接信息 { try { socket.close(); in.close(); out.close(); } catch (Exception ee) { } } String login = user + "," + pass; int port1 = 8001; try { // 建立网络连接 socket = new Socket(ip, port1); in = new DataInputStream(socket.getInputStream ()); out = new DataOutputStream(socket.getOutputStre am()); out.writeUTF(login); } catch (IOException ee) // 如果连接失败 { ipField.setText("呼叫失败"); stateField.setText("你呼叫没有成功"); } int port4 = 8004; try { socket = new Socket(ip, port4); in = new DataInputStream(socket.getInputStream ()); out = new DataOutputStream(socket.getOutputStre am()); out.writeUTF(user); stuinfo.setText("请求信息已发送"); } catch (IOException ee) // 如果连接失败 { ipField.setText("呼叫失败"); stateField.setText("你呼叫没有成功"); stuinfo.setText("你呼叫没有成功"); } if (socket != null) // 如果连接成功 { try { String queryInfo = in.readUTF(); // 得到查询结果 stuinfo.setText(queryInfo); out.flush(); out.close(); } catch (IOException e1) { // 出现异常 otherinfo.setText("数据传输错误");}}} else if (e.getSource() == beginExe) { // 生成试题String mgr = (String) subject.getSelectedItem();if (mgr.equals("英语")) { // 选择英语selectT("e");} else if (mgr.equals("数学")) { // 选择数学selectT("m");}stateField.setText("你已经选择了" + mgr + "试题");testinfo.setText("你已经选择了" + mgr + "试题");startTest.setEnabled(true);} else if (e.getSource() == startTest) { // 开始考试stateField.setText("考试开始,时钟计时");timeFlag = true;start();............} else if (e.getSource() == readNext) { // 读下一题目tempStr1 = keyField.getText().trim();uanswer += tempStr1 + "@";if (n <= enu-1) {System.out.println(tempStr1);stateField.setText("第" + n + "题,你选择的答案是:" + tempStr1);++n;// 显示下一题testArea.setText(tempTest[num]);++num;} ...............try {socket.close();in.close();out.close();} catch (Exception ee) {System.out.print("消除以往的连接");}try {socket = new Socket(ip, port3);in = new DataInputStream(socket.getInputStream ());out = new DataOutputStream(socket.getOutputStre am());out.writeUTF(user + "," + sub + "," + uanswer + "," + enu);stateField.setText("你已经提交完毕,请点击查看分数");testinfo.setText("你已经提交完毕,请点击查看分数");} catch (UnknownHostException e1) {stateField.setText("未找到服务器");} catch (IOException e1) {stateField.setText("数据传输出错");}timeFlag = false;lookScore.setEnabled(true);} else if (e.getSource() == lookScore) { // 查看分数public void run() {--minute;while (minute >= 0 && timeFlag) {try {sleep(1000);} catch (InterruptedException e) {System.out.println(e.getMessage() );e.printStackTrace();}second--;if (second == 0) {minute--;second = 59;}lastTimeF.setText(Integer.toStrin g(minute) + " : "+Integer.toString(second));if (minute == 0 && second == 59) {JOptionPane.showMessageDialog(nul l, "离考试结束还有1分钟,请抓紧答题!","时间提示对话框", RMATION_MESSAGE);}if (minute == 0 && second == 0) {System.exit(0);}}}public void selectT(String mgr) { tempTest = new String[100];String str1 = null, str2 = null;if (socket != null && in != null && out != null) // 消除以往的连接信息try {socket.close();in.close();out.close();} catch (Exception ee) {otherinfo.setText("消除以往的连接");}............4.8-----------------------Client.java--------------------------public void actionPerformed(ActionEvent e){if(e.getSource()==timer1){i=i+1;j=(j+2)%360;Color color=new Color((3*i)%255,(7*i)%255,(11*i)%255) ;label.setForeground(color);progress.setValue(progress.getValue() + 1);if(i>=150) {JFrame.setDefaultLookAndFeelDecor ated(true);new TestGui(); this.dispose(); timer1.stop(); timer2.stop(); } }if(e.getSource()==timer2) {if(n<12){label.setText(s.substring(0,n)); if(n==10) n=0; } n++; } }//public static void main(String args[]) {new Client();} }。