JAVA课程设计报告(标准化考试系统)_第1页
JAVA课程设计报告(标准化考试系统)_第2页
JAVA课程设计报告(标准化考试系统)_第3页
JAVA课程设计报告(标准化考试系统)_第4页
JAVA课程设计报告(标准化考试系统)_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计报告标准化考试系统专业计算机科学与技术 学生姓名 指导教师完成日期2013.72标准化考试系统 2 31.1课程设计目的 1.2课程设计内容与要求 32系统需求分析 42.1系统目标 42.2主体功能 42.3开发环境 43系统总体设计 53.1系统的功能模块划分 53.2系统流程图 64系统详细设计 74.1客户端模块设计 74.1.1用户登录模块设计(ClientLogin类) 74.1.2选择试卷模块设计(GetTestFile类) 4.1.3回答试卷查询模块设计(ClientTestArea类) 4.2服务器端模块设计 参考文献 标准化考试系统1.1课程设计目的2、进一步理解面向对象程序设计的思想和方法,利用Java3、课程设计将课本上的理论知识和实际应用相结合,锻炼学生发现问题、分4、培养学生在项目开发中团队合作精神、创新意识及能力;1.2课程设计内容与要求设计C/S模式的标准化考试系统,即客户端和服务器端都是Java应用程序,具(1)用户单击选项卡中的“登录”将出现登录界面。用户在登录界面输入学号、姓名··服务器的IP,并请求服务器建立套接字链接。用户登录的目的是为了将自己的基本信息存放到服务器上,以便服务器记录用户的考试成绩。因此,用户和服务器建立连接后,服务器将创建一个和用户相关的一个文件,该文件的名字由用户的学号、姓名··用户所在客户端机器的IP所组成。(2)单击端选项卡中的“选择试卷”将出现选择试卷界面。如果用户成功登录,即和服务器建立连接并在服务器端创建了和其相关的文件,那么,用户再选择4试卷界面可以将服务器上的试卷文件的名字存放到客户端界面中的下拉式列表中,然后再在下拉列表中选择一个试卷文件的名字提交给服务器。(3)单击端选项卡中的“答卷”将出现答卷界面。如果用户成功登录,并且用户通过“选择试卷”界面选择了一套试卷,那么用户在答卷界面可以从服务器读入所选试卷的内容,而且在“答卷”界面可以提交自己的答案给服务器、服务器将用户提交的答案存入用户登录时服务器所创建的和该用户相关的文件中。提交答案后,在“答卷”界面可以查询分数。2系统需求分析2.1系统目标通过本系统能够实现用户登录,选择试卷,完成试卷,查询分数等功能。2.2主体功能A.C/S模式,即客户端与服务器端都是Java应用程序;B.输入服务器IP地址,连接服务器功能;E.开始考试;F.完成考试后,学生可以查看自己的分数、试题、正确答案、分值以及自己所选择的答案;2.3开发环境MyEclipse3系统总体设计3.1系统的功能模块划分本系统主要有以下几个功能模块:用户登录,选择试卷,完成试卷,查询分数查询分数查询分数提交试卷完成试卷选择试卷用户登录标准化考试系统客户端窗口退出系统63.2系统流程图开始输入信息连接服务器N连接成功显示登录成功选择试卷显示试卷回答试卷提交试卷查看分数退出4系统详细设计必到必到1)成员变量用户输入学号、姓名··务器的IP.。c、hintMess是JLabel创建的标签,用于显示某些提示信息。2)方法a、ClientLogin()是构造方法,用来创建clientLogin类。b、actionPerformed(ActionEvent)方法是ClientLogin类实现ActionListener接口中的方法。ClientLogin创建的容器startCon按钮的ActionEvent事件监视器,当用户单击该按钮时,容器将执行actionPerformed(ActionEvent)方法进行相应的操作。8importjava.awt.*;importjava.awt.event.*;importjava.io.*;import.*;importjavax.swing.*;publicclassClientLoginextendsJPanelimplementsActionListener{StringverifyMess;JTextFieldinputNumber,inputName,inputServerIP;JLabelhintMess;publicClientLogin(){inputNumber=newJTextField(10);inputName=newJTextField(10);hintMess=newJLabel("请输入学号、姓名··务器的IP",JLabel.CENTER);inputServerIP=newJTextField(10);startCon.addActionListener(this);Boxbox1=Box.createHorizontalBox();box1.add(inputNumber);Boxbox2=Box.createHorizontalBox();box2.add(inputName);Boxbox3=Box.createHorizontalBox();box3.add(newJLabel("输入IP:"));box3.add(inputServerIP);Boxbox4=Box.createHorizontalBox();box4.add(startCon);BoxboxH=Box.createVerticalBox();boxH.add(box1);boxH.add(box2);boxH.add(box3);boxH.add(box4);JPanelpCenter=newJPanel();pCenter.add(boxH);pCenter.setBackground(newColor(210,210,110));setLayout(newBorderLayout());add(pCenter,BorderLayout.CENTER);JPanelpNorth=newJPanel();pNorth.setBackground(Color.green);pNorth.add(hintMess);add(pNorth,BorderLayout.NORTH);publicvoidactionPerformed(ActionEvente){if(e.getSource()==startCon){number=inputNumber.getText().trim();name=inputName.getText().trim();if(number.length)>0&&name.length)>0){IP=inputServerIP.getText().trim();try{LoginThreadthread=newLoginThread(hintMess);if(!(thread.isAlive))){thread=newLoginThread(hintMess);thread.makeConnection(number,name,IP);thread.start();}catch(Exceptionee){hintMess.setText("无法连接"+ee);}}JOptionPane.showMessageDialog(this,"必须输入学号和姓名"."·告"JOptionPane.WARNING_MESSAGE);}}classLoginThreadextendsThread{Socketsocket;InetSocketAddresssocketAddress;DatalnputStreamin;DataOutputStreamout;JLabelhintMess;LoginThread(JLabelhint){hintMess=hint;}publicvoidmakeConnection(Stringnumber,Stringname,StringIP)throwsIOException{InetAddressaddress=InetAddress.getByName(IP);socketAddress=newInetSocketAddress(address,6666);socket=newSocket();socket.connect(socketAddress);in=newDatalnputStream(socket.getInputStream());out=newDataOutputStream(socket.getOutputStream());out.writeUTF("学生"+number+""+name);publicvoidrun){s=in.readUTF();StringverifyMess=s.substring(s.indexOf(":")+1);GetTestFile.setVerifyMess(verifyMess);ClientTestArea.setVerifyMess(verifyMess);GetTestFile.setSocketAddress(socketAddress);ClientTestArea.setSocketAddress(socketAddress);hintMess.setText(s);JOptionPane.PLAIN_MESSAGE);if(socket.isClosed))return;JOptionPane.showMessageDialog(null,tishi,"操作提示".JOptionPane.PLAIN_MESSAGE);if(socket.isClosed))return;}return;}系统标题登录答卷改试卷名字已经全部列出请在列表中选择试卷选择试卷text1.txt提交text1.txttext2.txt2、类的主要成员变量和方法1)成员变量a、hintMess是JLabel创建的标签,用于显示某些提示信息。b、list是JComboBox创建的下拉列表,用于显示从服务器得到的试卷文件的创建的对象,其上的名字分别为“列出试卷的名字”和“提交”,该两个按钮都将当前容器注册为自己的ActionEvent事件监视2)方法a、GetTestFile()是构造方法,用来创建getTestFile类。中的方法。GetTestFile创建的容器getTestFile和submit按钮的ActionEvent事件监actionPerformed(ActionEvent)方法进行相应的操作。3、主要程序代码importjava.awt.*;importjavax.swing.*;importjava.awt.event.*;importjava.io.*;import.*;publicclassGetTestFileextendsJPanelimplementsActionListener,Runnable{staticStringverifyMess;staticInetSocketAddresssocketAddress;StringfileName;JLabelhintMess:JButtongetTestFile,submit;JComboBoxlist;DataInputStreamin;DataOutputStreamout;Threadthread;intn=0;publicGetTestFile(){hintMess=newJLabel("单击\"列出试卷名字\"按纽从服务器得到试卷的名字");hintMess.setBackground(Color.green);getTestFile.setBackground(Color.green);submit.setBackground(Color.orange);getTestFile.addActionListener(this);submit.addActionListener(this);Boxbox1=Box.createHorizontalBox();box1.add(getTestFile);Boxbox2=Box.createHorizontalBox();box2.add(list);box2.add(submit);boxH.add(box1);boxH.add(box2);thread=newThread(this);JPanelpCenter=newJPanel();pCenter.add(boxH);setLayout(newBorderLayout()pCenter.setBackground(Coloadd(pCenter,BorderLayout.CENTER);JPanelpNorth=newJPanel();pNorth.add(hintMess);add(pNorth,BorderLayout.NORTH);}publicstaticvoidsetVerifyMess(Stringmess){verifyMess=mess;}publicstaticvoidsetSocketAddress(InetSocketAddressaddsocketAddress=address;}publicvoidactionPerformed(ActionEvente){if(e.getSource()==getTestFile){list.removeAllItems();try{makeConnection();//见后面的makeConnection()方法if(!(thread.isAlive))){thread=newThread(this);thread.start();}catch(Exceptionee){JOptionPane.PLAIN_MESSAGE);if(e.getSource()==submit){n=list.getItemCount();fileName=(String)list.getSelectedItem();Filefile=newFile(fileName);ClientTestArea.setExaminationFile(file);JOptionPane.showMessageDialog(this,tishi,"操作提示",JOptionPane.PLAIN_MESSAGE);privatevoidmakeConnection()throwsIOException{socket.connect(socketAddress);in=newDataInputStream(socket.getInputStream());out=newDataOutputStream(socket.getOutputStream());}publicvoidrun(){try{s=in.readUTF();StringlistItem=s.substring(s.indexOf(":")+1);list.addltem(listItem);}hintMess.setText("试卷名字已经全部列出hintMess.setBackground(Color.green);break;JOptionPane.showMessageDialoJOptionPane.PLAIN_MESSAGE);break;}catch(Exceptionee){}1、效果图位基频春数登班库记春普份达中图共产其老毛求东地垫通立为光的指后费指的老权是面样去和式中全会#、离父会次C.中其六部七中全金D.中其七大5,马克理主安与中图东标神法各的第一次历史理气眼的肆能的要是c.期三民了义D.邓不辛球浴。毛浮东来帮球内是在什么时丽、真确方机时归它民基备针期0、主就基盐法等国中题0、建四以市oA.大B。十三大、十因大m、十五大、津设有中国特向社会主义首业的球本理成间在变什久是社会主义,在样康面社金主义个甲心,两全基本点.正确伦情泽。实盛。打言的关系世真管重和试2、类的主要成员变量和方法a、hintMess是JLabel创建的标签,用于显示某些提示信息。b、examineArea是JPanel创建的容器,用于显示试题和答题卡。为“提交答案”、“显示试卷”和“查看分数”,这三个按钮都将当前容器注册为自己的ActionEvent事件监视器。2)方法b、actionPerformed(ActionEvent)方法是ClientTestArea类实现ActionListener接的ActionEvent事件监视器,当用户单击handAnswer,startTest和lookScore按钮时,容器都将执行actionPerformed(ActionEvent)方法进行相应的操作。importjava.awt.*;importjavax.swing.*;importjava.awt.event.*;importjava.io.*;.*:importjava.util.*:publicclassClientTestAreaextendsPanelimplementsActionListener,Runnable{staticInetSocketAddresssocketAddress;staticFileexaminationArrayList<JRadioButton>choiceList;DataOutputStreamout;Threadthread;staticJPanelexaminJLabelhintMess;JButtonhandAnswer,startTthread=newThread(this);choiceList=newArrayList<JRadioButton>();examineArea=newJPanelexamineArea.setForeground(ColorhandAnswer.setEnabled(false);lookScore.setEnabled(false);startTest.addActionListener(this);handAnswer.addActionListener(this);lookScore.addActionListener(this);setLayout(newBorderLayoutJPanelpCenter=newJPanel();pCenter.setLayout(newBorderLayout());pCenter.add(newJScrollPane(examineArea),BorderLayout.CENTER);add(pCenter,BorderLayoutJPanelpSouth=newJPanel();pSouth.setBackground(Color.blue);pSouth.add(handAnswer);pSouth.add(startTest);pSouth.add(lookScore);add(pSouth,BorderLayout.SOUTH);JPanelpNorth=newJPanel();pNorth.setBackground(Color.green);pNorth.add(hintMess);add(pNorth,BorderLayout.NORTH);}publicstaticvoidsetVerifyMess(Stringmess){verifyMess=mess;publicstaticvoidsetSocketAddress(InetSocketAddressaddress){socketAddress=address;publicstaticvoidsetExaminationFile(Filef){examinationFile=f;examineArea.removeAll();publicvoidactionPerformed(ActionEvente){if(e.getSource()==startTest){choiceList.clear();lookScore.setEnabled(false);try{makeConnection();examineArea.removeAll();out.writeUTF("显示试卷:"+verifyMess+"#"+examinationFileintok=JOptionPane.showConfirmDialog(this,m,"确认对话框",JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE);if(ok==JOptionPane.YES_OPTION){if(!(thread.isAlive))){thread=newThread(this);thread.start();}handAnswer.setEnabled(true);}catch(Exceptionexp){JOptionPane.showMessageDialog(this,"您未登录或选择试卷","操作提示",3}if(e.getSource()==handAnswer){Stringm="只有一次提交答案的机会!,一旦提交将无法继续答题,是否确认提交答intok=JOptionPane.showConfirmDialog(this,m,"确认对话框",JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE);if(ok==JOptionPane.YES_OPTION){StringBufferstr=newStringBuffer();for(inti=0;i<choiceList.size();i++){JRadioButtonbox=choiceList.get(i);if(box.isSelected))str.append(box.getText));StringmyAnswer=newString(str);try{makeConnection();handAnswer.setEnabled(false);lookScore.setEnabled(true);}catch(Exceptionexp){JOptionPane.showMessageDialog(this,"您未登录或选择试卷","操作提示",JOptionPane.PLAIN_MESSAGE);}if(e.getSource()==lookScore){StringBufferstr=newStringBuffer();for(inti=0;i<choiceList.size();i++){JRadioButtonbox=choiceList.get(i);if(box.isSelected))str.append(box.getText());}StringmyAnswer=newString(str);try{makeConnection();out.writeUTF("查看得if(!(thread.isAlive))){thread=newThread(this);thread.start():}catch(Exceptionexp){JOptionPane.showMessageDialog(this,"您未登录或选择试卷","操作提示"}}}privatevoidmakeConnection()throwsIOException{socket=newSocket();socket.connect(socketAddress);in=newDatalnputStream(socket.getInputStream());out=newDataOutputStream(socket.getOutputStream());}publicvoidrun(){while(true){Stringcontent=s.substring(s.indexOf(":")StringReaderread=newStringReader(cBufferedReaderin=newBufferedReader(read);while((str=in.readLine())!=null){//计算出题目总数number++;)examineArea.setLayout(newGridLayout(number,2));//第2列上放置答题卡JTextArea[]text=newfor(inti=0;i<text.lengthtext[i]=newJTextArea(4,10);text[i].setLineWrap(true);}read=newStringReader(contein=newBufferedReader(read);while((str=in.readLine())!=null){text[i].append(str+"\n");//text[i]中显示第i题的内容examineArea.add(newJScrollPane(text[i]));JRadioButton[]box=newJRadioButton[4];ButtonGroupgroup=newButtonGroup();String[]choiceCharfor(intk=0;k<4;k++){box[k]=newJRadioButton(choiceChar[k],true);group.add(box[k]);JPanelpAddbox=newJPanel();pAddbox.setBackground(Color.yellow);pAddbox.setBorder(BorderFactory.createRaisedBevelBorder());FlowLayoutflow=newFlowLayout();flow.setAlignment(FlowLayout.LEFT);pAddbox.setLayout(flow);for(intk=0;k<4;k++){pAddbox.add(box[k]);choiceList.add(box[k]);}examineArea.add(pAddbox);examineArea.repaint();validate();return;}JOptionPane.showMessageDialog(this,s,"",JOptionPane.PLAIN_MESSAGE);return;}}JOptionPane.showMessageDialog(this,""+e,"",JOptionPane.PLAIN_MESSAGE);return;4.2服务器端模块设计标准化考试服务器端的主类,负责响应客户的连接请求、建立和客户的套接字链接,并负责在服务器端创建和用户相关的文件。PtessinudutDetlestinFCantSeserllaaAppicdtionlCdlhsnAdnn客户的块;1127,0,0.1等待用户呼叫,ajdlmn2861600Zhna22、类的主要成员变量和方法1)成员变量a、server是ServerSocket对象,负责等待接收客户的套接请求,当有客户请求套接字连接时,server将接受用户的请求,并调用accept()方法返回服务器端所建立的Socket对象you,即建立服务器端套接字的连接。b、You是Socket对象,该对象是驻留在服务器端的套接字对象,由server调c、loginStudent是LinkedList<String>链表对象,负责存储用户登录的基本信息。d、youAddress是InetAddress对象,负责存放客户端的IP。b、Server对象调用startServer(intport)方法响应客户的请求。c、main方法是程序运行的入口方法。import.*;importjava.util.*importjava.io.*;LinkedList<String>loginStudent;InetAddressyourAddress;loginStudent=newLinkedList<String>();}publicvoidstartServer(intport){}}you=server.accept();yourAddress=you.getInetAddress();System.out.println("客户的IP:"+yourAddress);}newServerThread(you,yourAddress,loginStudent).start();}}publicstaticvoidmain(Stringargs[]){server.startServer(6666);1、效果图ServerThread类驻留在服务器端,没有可显示的效果图2、主要成员变量和方法d、readTest是ReadTestquestion对象,负责读取试卷文件。e、yourAddress是InetAddress对象,负责存放客户端的IP。2)方法a、ServerThread(Socket,InetAddress,LinkedList<String>list)是构造方法,当使用该构造方法创建线程时,通过该方法的参数Server类中的you、yourAddress和3、主要程序代码importjava.io.*;.*;importjava.util.*;publicclassServerThreadextendsThread{LinkedList<String>loginStudent;InetAddressyourAddress;DataOutputStreamout=null;DataInputStreamin=null;FilecurrentDir,dirStudent;booleanisLogin=false;ServerThread(Sockett,InetAddresss,LinkedList<String>list){socket=t;yourAddress=s;loginStudent=list;currentDir=newFile(System.getProperty("user.dir"));dirStudent=newFile(currentDir,"Student");dirStudent.mkdir();try{in=newDataInputStream(socket.getInputStream());out=newDataOutputStream(socket.getOutputStream());~catch(IOExceptione){}readTest=newReadTestquestion();}publicvoidrun(){try{s=in.readUTF();verifyMess=s+""+yourAddress;Filefile=newFile(dirStudent,s+".txt");//存储学生信息的文件byte[]bb=verifyMess.getBytes();if(!(file.exists))){RandomAccessFileoutNumber=newRandomAccessFile(file,"rw");outNumber.write(bb);outNumber.close();if(loginStudent.contains(verifyMess)){out.writeUTF("已经成功登录了");break;//如果已经登录过,就消灭因重新登录而创建的当前线程}loginStudent.add(verifyMess);}〈verifyMess=s.substring(s.lastIndexOf(":")+1);System.out.println(verifyMess);isLogin=loginStudent.contains(verifyMess);if(isLogin){StringfileName[]=currentDir.list(newFilenameFilter){publicbooleanaccept(Filedir,Stringname){returnname.endsWith(".txt");}for(inti=0;i<fileName.length;i++)return;verifyMess=s.substring(s.lastIndexOf(":")+1,s.lastIndexOf("#"));System.out.println(verifyMess);isLogin=loginStudent.contains(verifyMess);StringfileName=s.substring(s.lastIndexOf("#")+1);Filefile=newFile(fileName);if(isLogin){StringcontentTest=readTest.getTestContent(file);}else{out.writeUTF("请登录");return:}verifyMess=s.substring(s.lastIndexOf(":")+1,s.lastIndexOf("#"));System.out.println(verifyMess);isLogin=loginStudent.contains(verifyMess);if(isLogin){StringclientAnswer=s.substring(s.indexOf("#")+1);StringfileName=verifyMess.substring(0,verifyMess.indexOf("/"));Filefile=newFile(dirStudent,fileName+".txt");RandomAccessFileoutAnswer=newRandomAccessFile(file,"rw");outAnswer.seek(outAnswer.length());bb=clientAnswer.getBytes();outAnswer.write(bb);outAnswer.close();}else{out.writeUTF("请登录");}return;}verifyMess="";verifyMess=s.substring(s.indexOf(":")+1,s.indexOf("#"));System.out.println(verifyMess);isLogin=loginStudent.contains(verifyMess);if(isLogin){StringclientAnswer=s.substring(s.indexOf("#")+1,s.indexOf("*"));StringfileName=s.substring(s.indexOf("*")+1);Filefile=newFile(fileName);Stringstr=readTest.getCorrectAnswer(file);for(intk=0;k<str.length();k++){if(str.charAt(k)==clientAnswer.charAt(k))score++;if(str.length)>0){fileName=verifyMess.substring(0,verifyMess.indexOf("/"));file=newFile(dirStudent,fileName+".txt");RandomAccessFileoutAnswer=newRandomAccessFile(file,"rw");outAnswer.seek(outAnswer.length());outAnswer.write(bb);}}return;}}try{socket.close();catch(Exceptioneee){}ReadTestquestion类驻留在服务器端,没有可显示的效果图2、主要成员变量和方法1)成员变量该类没有成员变量。2)方法a、getTestContent(File)方法负责读取参数指定的试卷文件中的考试内容,即读取试卷文件中从第2行以后的全部文本。b、getCorrectAnswert(File)方法负责读取参数指定的试卷文件中的答案,即读取试卷文件中从第1行文本。3、主要程序代

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论