- 1.50 MB
- 10页
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
'毕业实习报告班 级:姓 名:学 号:指导教师:开课时间:2011至2012学年第1学期9
一、项目名称达内在线考试系统(TarenaOnlineExaminationSystem)。二、项目平台Windowsxp操作系统。三、项目环境MyEclipse8.6集成化开发工具环境。四、项目技术学生在线考试系统实现的是学生通过客户端登陆服务器完成考试的过程,在这个项目整个过程中,我们实现了服务器的一些服务程序的开发,以及客户端的程序开发,在服务器这边,我们要实现的服务器能够响应客户端发送的数据请求,并且能够分辨出发送来的是什么请求,在客户端这边,客户端要能够接受服务器发送过来的数据,并且解析成所要的数据类型,并且要能让用户可阅读,客户端与服务器的一个线程保持着连接。下面就简单说一下其中用到的一些技术:在线考试系统需要两个方面的程序开发,一个是服务器的服务开发,另一个是客户端的开发,这两个部分是分别处于两个不同的机器上运行的,也可以是在同一台机器上运行的。对于服务器的程序设计,因为是服务器,所以必须要实现的肯定是能为多个用户进行服务,在这里也就是多个学生同时在线考试,我们这里使用的是多线程技术。而客户端这边,我们通常就是向服务器发送请求,服务器相应我们的请求,从而完成服务器与客户端之间的通信。在客户端与服务器之间,我们要掌握服务器的套接字编程技术和客户端的套接字编程技术。五、项目描述这里主要介绍一下学生在线考试系统,学生在线考试系统主要是学生通过客户机登陆自己的账号,然后完成课程科目的考试过程,这当中没有任何纸质的试卷出现,全部都是以网路形式完成考试。学生在线考试系统主要分成两个部分,一个是服务器部分,另一个则是客户机部分,服务器与客户端之间是以通过网路连接起来的,服务器的一个线程与一个客户机是连接着的。在服务器部分,服务器先启动,先是读取配置文件,然后将试卷信息读取到服务器中,还要读取学生的信息,学号,姓名,密码,都要读取到服务器中,对于这些信息的读取,将会被封装在其他的类中,然后才是等待客户端发送数据连接请求,一旦发现有请求,就创建一个服务线程与之保持连接,等待考试完成的数据请求发送过来,才断开连接,在这其中服务器是一直处于监听客户端请求连接的运行状态。在整个运行过程,服务器都是以控制台程序运行。客户端部分,则是比较简单,9
因要给学生操作,所以,为了方便操作,这里用到了图形界面的操作,这里一共有三个部分的界面,第一个就是学生登录的界面,学生要输入学号和密码登录服务器,第二个就是学生选择考试科目的界面,这里呢,要先将前面一个窗口销毁,然后再创建新的窗口,第三个就是学生考试界面的窗口,这个窗口稍微复杂点,涉及到许多东西,这里在第三个窗口创建之前也是要先销毁第二个窗口。最后用户点击交卷完成考试过程,并且显示得分,左后关闭窗口,服务器同时要断开连接,线程结束。在这个三个窗口中,必须要有个连接与服务器保持连接,这里我们是将其划分成一个类,并且作为是哪个窗口的一个属性,当一个窗口被销毁,另一个窗口被创建时候,这个属性就要传送个另一个窗口使用。在整个系统中,我们会涉及到两个类,一个是试卷类,另一个是学生类,试卷类中有个属性就是问题类,这两个类的信息,都是以配置文件的形式保存在文件中,我们可以使用工具类进行读取他们。六、设计思路在这里我们就以服务器与客户端之间的连接为中心,简单说一下这个考试系统的搭建过程。首先,服务器需要启动,服务器需要读取配置文件,这里我们就需要将所有的试卷题目以规定的格式写在一个配置文件中,把所有的学生信息写在另一个配置文件中,服务器需要试卷信息,所以定义试卷类,题目类,以及学生类,因为服务器与客户机之间需要有数据的请求,而且分为多于一种的请求类型,这里我们有连接请求,发送试卷请求,答题请求,所以我们定义一个请求类,这个服务器还需要不断地从磁盘文件中读取信息,所以为了减少代码量,我们这里需要几个工具类,一个是创建套接字的连接,另一个就是读取题目配置文件的题目的工具类。这样服务器的基本框架已经出来了。在客户机这边,我们只需要考虑一个线程就行了,所以这里我们只要四个类,其中有三个是窗口类,另一个是与服务器线程连接的类,这个连接类是作为三个窗口类的一个属性,用于三个窗口与服务器之间发送数据用,三个窗口也只能通过这个连接类与服务器之间进行通信,这三个窗口是依次通过这个连接类与服务器进行通信的。这样这个客服器的整体设计也就出来了。另外要说一下就是,客户机通过IP地址和端口号进而与服务器之间进行连接进行数据通信。同时一个客户机只能与一个服务器进行连接,而一个服务器会与很多个客户机建立连接,服务器的每一个线程对应着一个客户机的连接的进程。七、项目详细设计前面已经介绍说,在线考试系统主要的就是两个重要的部分,服务器部分和客户机部分,另外还有一些实体类和一些工具类,下面就按照包得结构详细的介绍一下在线考试系统的设计:1,实体类部分:在实体类中可分为四个部分,一个是试卷类,一个是试题类,学生类,还有个就是请求类。Paper类:9
属性:subjectString表示考试科目allQusstionList表示所有题目的集合answersList表示学生选择的答案的集合方法:addQusetion()void表示向试卷中添加题目toString()void将试卷转换成字符串格式Question类:属性:titleString表示题目的标题itemsList表示选项answerchar表示正确选项方法:toString()void表示将题目转换成字符串格式Student类:属性:idint表示学生学号nameString表示学生姓名passwdString表示学生的密码2,读取配置文件类PaperDao接口方法:getPaper()PaperDaoFromFile类:实现PaperDao接口,实现getPaper()方法;StudentDao接口方法:getStudent()StudentDaoFromTextFile类:实现StudentDao接口实现getStudent()方法3,工具类QuestionReader类封装了一些读取磁盘文件的方法SocketUtil类封装了一些创建套接字连接的基本格式4,服务器的类ServetMainClass类:属性:ssServerSocket表示服务器的套接字stuDaoStudentDao表示学生信息pDaoPaperDao表示试卷信息proProperties表示一个键值对,通信时传输信息用方法:main()void表示服务器启动入口函数init()void表示初始化函数内部类:ServerThread:9
sSocket表示与客户机连接的套接字oosObjectPutputStream表示对象输出流run()void表示线程运行loginvoid表示登陆请求beginvoid表示开始考试请求sendvoid表示结束考试请求5,客户端的类LginFrame类:登录窗口学号输入框密码输入框确定按钮取消按钮SelectSubjectFrame类:选择科目的窗口一个现则科目的标签一个选择科目的下拉菜单一个确定按钮一个取消按钮ExamMainFrame类:学生考试窗口标题:学生在线考试系统显示题目的可滚动文本框四个选项的可选框一个显示题号和剩余题目数的标签上一题,下一题,交卷按钮一个显示剩余时间的标签Client类:属性:ssocket表示与服务器连接的套接字oisobjectinputStream表示对象输入流oosobjectoutputstream表示对象输出流方法:Loginvoid表示向服务器发送登陆请求数据方法recLoginvoid表示从服务器接受登陆请求数据方法beginvoid表示向服务器发送开始考试请求数据方法recLoginvoid表示从服务器接受试卷信息数据方法closevoid表示关闭I/O流exitvoid表示学生退出考试系统方法sendvoid表示学生点击交卷按钮发送给服务器方法上面介绍了各个类的具体属性和方法,接下来介绍一下各个类之间的调用和依赖关系:9
服务器服务器线程ClientLoginFrameSelectSubjectFrameExamMainFrame配置文件PaperDaoFromFileStudentDaoFromTextFileSocketUtilQuestionReader上图表示整个在线考试系统的结构图,可以看出,其最主要的就是Client与服务器进程之间的连接,整个客户机与服务器之间都是靠着整个连接才能够完成在线考试整个过程的,这之间的数据交换和通信都是以这个连接为基础的,服务器在一开始运行的时候就要将配置文件中的数据读取到服务器中,然后才能发送数据给客户机,客户机每个窗口都是以Client这个类与服务器进程进行通信的,另外除了这些外还有两个工具类,只是为了少写些代码,做个封装而已,这符合了java程序的封装性。下面就对上图的几个重要的类做个详细设计的说明:1,服务器线程类服务器的线程类,是服务器主类的一个内部类,只是作为一个服务的类,不需要对外公开,所以只是设在一个服务器类的内部,当服务器的运行到监听套接字监听客户端是否发送连接请求,程序就暂停,一直到有连接请求才会继续运行下去,程序会创建一个服务进程与之连接为之服务,只适合会运行run()方法,判断客户端发送的请求类型,来判断调用哪个方法,然后向客户端发送与之对应的数据给客户端处理。下面详细解释运行过程:步骤:1,在初始化init()方法中是个while()死循环,不断的监听客户机的套接字连接请求,当有连接请求的时候就继续运行。2,新建一个服务线程,这个服务线程继承自线程类,直接调用start()方法,让服务进程直接运行起来,这样,服务线程就与客户机连接起来了。3,9
服务线程首先是创建一个输出流,准备给客户机发送数据,然后就是一个while()死循环,不断地从流中读取数据,一读取到数据就要判断请求类型。另外,在服务器的控制台中,在每个用户连接过程中给服务器发送数据请求,服务器将在控制台即时输出连接请求的信息,还有用户的请求情况,这主要是显示服务器即时监控的效果。其实不输出信息也是没有关系的。1,判断请求的类型,这个要使用到一个Request请求类里面的四个静态常量,这里使用到一个switchcase语法,来匹配所要调用的方法。2,如果静态常量是1,也就是login_request,程序就调用login()方法,login()方法,主要的就是发送学生信息和选择考试科目的链表给客户端程序,login调用完成后,就进入下一个循环,继续监听流中的数据请求。3,如果是静态常量2,就要调用begin方法,程序调用begin方法,根据发送过来的选择的课表信息,就会向客户端发送相应的考试题目,以链表的形式发送,然后就继续进入下一个循环监听。4,如果是静态常量3,就会调用交卷信息的send()方法,这个方法不需要向客户端发送数据信息,这个请求是告诉服务器,学生考试完成,要求将分数写入到磁盘文件中,调用完成后继续监听。5,如果静态常量4,就表示学生要退出考试的界面,这时候,客户端关闭,服务器接收到退出请求之后,就要直接跳出循环,然后关闭与之连接的流和套接字连接。6,经过以上几个步骤,学生在线考试过程全部结束。2,客户端窗口类客户端窗口类,主要是让用户直接在指定的地方输入信息,然后进入在线考试过程,这里,首先是让学生输入信息,确认身份,主要的是学号和密码,然后就是选择科目,最后进入考试界面,最后交卷,退出,这几个以窗口形式呈现给用户的,下面主要介绍程序的运行过程:步骤:1,首先,用户启动客户端程序,程序进入用户登录的界面,用户必须输入正确的学号和密码才能进入到选择学科的界面,如果用户的学号或者密码错误,将以弹出的对话框的形式提醒用户从新输入信息。2,用户输入成功信息,则表示登录成功,然后就进入到选择科目的界面,用户选择所需要的考试科目,点击确定。3,之后,用户就进入到考试界面,在窗口上回看到学生的信息,中间是选择题的第一题,可滚动面板要设置成不可操作,同时,开始时间的倒计时,学生必须在规定的时间内选择将所有的考题做完,不然,系统将会自动交卷,到时,选项将不可操作。4,学生交卷后,系统自动计算分数,并且以弹出消息框的形式告诉用户交卷成功,并且显示考试分数。5,之后,学生只能点击退出,退出考试。上面是文字叙述程序运行过程,下面就用程序流程图的形式,表示出程序的整个运行过程:9
1,服务器流程图run()方法开始while()死循环监听请求类型Login()方法Begin()方法send()方法exit()方法类型1(登陆)类型2(开始)类型3(交卷)类型4(退出)2,客户端的Client流程图服务器线程Login()recLogin()begin()recbegin()send()exit()exit()exit()这里对上面的三个exit()说明一下,三个exit()中,一个是只是启动客户端就退出了,一个是表示在选择科目的时候的退出,最后一个则是考试或者考试完成以后退出的。八、程序运行截图9
学生登陆对话框学生选课对话框学生考试界面九、项目心得(总结)经过三五天的努力,学生在线考试系统,可以算是基本完成了,下面就对这个项目在完成的过程中遇到的一些难点,和一些注意点作简要说明一下,然后也顺便说一说,在整个项目完成的过程中所得到的知识。在整个系统中,我们要义客户端与服务器之间的连接作为中心,以此为基础,搭建整个系统的框架,然后再慢慢地完成各个部分的功能。9
首先,我们将整个系统换分成两个部分,一个是服务器部分,另一个是客户端部分,对于服务器这部分,我们肯定是要保存学生和试卷的信息,所以要写一个读取学生信息和读取试卷信息的功能,这样我们再慢慢地进行细化功能,其中,我们可以将一些功能相同的类再次进行抽象和封装,就像我们前面提到的两个工具类,这样有利于我们的简化代码量,另外还要注意实体类和抽象类的划分,实体类与实体类之间有很多是属性与类之间的关系,也就是说,一个类的属性有可能是另一个类。对于客户端,我们要考虑到使用图形界面来美化客户端程序,还要注意的就是图形界面要与连接的套接字不要写到一起,我们可以将Client连接类作为图形界面的一个属性,这样是为了以后的更好的维护,同时也是验证了面向对象的封装性。在这个考试系统开发中,我们也许会遇到一些难以解决的问题,在服务器的开发中,我们要注意的就是服务器的套接字编程步骤,这个一定要熟练掌握,还有就是读取配置文件中的内容,内容一定要按照指定的格式书写,不然,我们的程序是无法读取的,程序并不会像人一样,程序只会按照指定的读取方式,读取指定的内容,所以这个配置文件一定要规范。还有要注意的就是服务器要保持一直运行状态。对于客户端这边,我之前用的一个方法就是每个面板都有一个连接与服务器保持着连接,这样的话,当客户端关闭时候,就有两个连接没有关闭,导致程序处错误,另外还有个错误就是,我连续创建了三个连接,我向其中写入数据的时候,估计也会导致读取的时候混乱,不知道读取哪一个,这样可能也是导致错误的原因。因此,我想一个客户端只有一个与服务器保持着连接,这样,程序运行就没有错误,程序的连接也很清晰明了。一个大的系统开发,会涉及到很多的小知识点,我们从一个大的项目中能够复习到我们之前学到的很多小的只是点,另外,要是遇到一些下的知识点没有学到过,我们可以通过其他途径学到手。这样,既复习了知识点,有学到了新的知识点。这样对我们以后的工作学习会有很大的帮助。9'