标准化学生评课系统.docx
- 文档编号:29849944
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:39
- 大小:292.71KB
标准化学生评课系统.docx
《标准化学生评课系统.docx》由会员分享,可在线阅读,更多相关《标准化学生评课系统.docx(39页珍藏版)》请在冰豆网上搜索。
标准化学生评课系统
惠州学院计算机科学系
课程设计指导书
课程名称:
网络通信程序设计课程设计
题 目:
标准化学生评课系统
学生姓名:
XXX
学 号:
XXXXXXX
班 级:
XXXXXXXXXXX
指导教师:
XX
时间:
2011年X月X日
标准化学生评课系统软件报告
学号:
姓名:
班级:
1、引言——软件的开发背景及应用价值
1.1开发背景
大学校园又有新鲜事,学生通过学校的网上评课系统给教授评分,“炒”掉了一些老师。
“网上评课”制度明晰了学生为本的观念,将教学质量的判断权放在学生手中,这无疑是有积极意义的。
1.2应用价值
价值之一是,弄清了“谁为本”的问题。
在教学活动中,“谁为本”似乎不难理解,但在实践中往往背道而驰。
理论上,学生作为教育服务的购买者,有权利对教育的质量作出要求。
价值之二是,“网上评课”有机制上的保障,有比较合理的制度安排。
制度的力量来源于人们对游戏规则的尊重,来源于制度安排的公平性。
“网上评课”制度给了培育学生民主素养很好的实践机会。
2、正文——软件开发设计内容
2.1需求分析
(1)用户单击选项卡中的“学生登陆”将出现登陆界面。
用户在登陆界面输入学号、姓名以及服务器的IP,并请求服务器建立套接字连接。
用户登录的目的是为了将自己的基本信息放到服务器上,以便服务器记录用户的评价结果。
因此,用户和服务器建立连接后,服务器将创建一个和用户相关的一个文件,文件的名字由用户的学号和姓名组成。
(2)单击选项卡中的“选择老师”将出现选择老师界面。
如果用户成功登录了,即和服务器建立连接并在服务器端创建了和其相关的文件,那么,用户在该界面可以将服务器上需被评课老师的名字存放到客户端界面中的下拉式列表中,然后再在下拉列表中选择一个文件的名字提交给服务器。
(3)单击选项卡中的“开始评价”将出现评价界面。
如果用户成功登录,并且用户通过“选择老师”界面选择了老师,那么用户在评价界面可以从服务器读入所选老师文件的评价内容,而且在该界面可以提交自己的评价结果给服务器、服务器将用户提交的结果存入用户登录时服务器所创建的和该用户相关的文件中。
提交评价结果后,在该界面也可以查询自己已经评价的结果。
2.2总体设计
在设计学生评课系统时,编写了8个java源文件:
Server.java,ReadTeacherFile.java,ServerThread.java,ClientWindow.java,ClientLogin.java,GetTeacherFile.java,ClientTestArea.java,JDesktop.java。
其中Server.java,ReadTeacherFile.java和ServerThread.java为服务器端java程序编译产生所需要的类;其他的是客户端java程序编译产生所需要的类。
除了以上8个java源文件所编译产生的类外,还需要java系统提供的一些重要的类,如ServerSocket,Socket,和JTabbedPane等类。
所用到的一些重要类以及之间的组合关系如下图a和图b所示:
图a客户端类之间的组合关系
图b服务器端类之间的组合关系
2.2.1被评价老师文件(服务器端)
标准化学生评课系统使用文本文件来管理评价内容。
即每个被评价老师为一个文本文件。
文件和服务器端java程序存放在同一目录中。
文件的编辑格式有特殊的要求,详见2.3.1节。
2.2.2Server.java(服务器端主类)
Server类创建的对象负责响应客户请求,该类含有main方法,服务器从该类开始执行。
Server类的成员变量中有4种重要类型的对象:
ServerSocket、LinkedList
Server类运行效果如图c所示:
图cServer类运行效果
2.2.3ServerThread.java(服务器端)
ServerThread类是Thread类的子类,在Server类中负责为请求连接的用户启动一个线程对象。
2.2.4ReadTeacherFile.java(服务器端)
ReadTeacherFile类是ServerThread类的重要成员之一,负责创建读取被评课老师的对象。
2.2.5ClientWindow.java(客户端主类)
ClientWindow类负责创建标准化评课系统客户端的主窗口,该类含有main方法,客户端java程序从该类开始执行。
ClientWindow类的成员变量中有4种重要类型对象:
ClientLogin、GetTeacherFile、ClientTestArea、JTabbedPane对象。
ClientWindow类的主要成员的作用将在后面的详细设计中阐述,ClientWindow类创建的窗口以及其中的主要成员对象如图d所示:
图dClientWindow窗口及主要的成员对象
2.2.6ClientLogin.java(客户端)
ClientLogin类创建的对象是ClientWindow类的重要成员之一,负责提供登陆界面。
2.2.7GetTeacherFile.java(客户端)
GetTeacherFile类创建的对象是ClientWindow类的重要成员之一,负责提供选择老师界面。
2.2.8ClientTestArea.java(客户端)
ClientTestArea类创建的对象是ClientWindow类的重要成员之一,负责提供评价老师界面。
2.2.9JDesktop.java(客户端)
JDesktop类创建的对象是ClientTestArea类的重要成员之一,负责提供学生打开相关记事本,即记录学生评价的文本文件。
2.3详细设计
2.3.1老师文件的编写
该评课系统没有使用数据库,而是使用文件来处理。
本评课系统需按特殊的简单格式编写老师文件。
具体要求如下:
(1)老师文件的第一行是n(取决于评价内容数目)个“优秀”,“优秀”之间要有空格。
(2)每条评价内容之后必须有“此处标志”四个字。
例如,“肖东.txt”被评老师文件的部分内容:
优秀优秀优秀优秀优秀
1.上课用普通话,谈吐优秀!
此处标志
2.上课幽默大方,有味道!
此处标志
3.对学生负责任!
此处标志
4.合理安排上课时间。
此处标志
5.抛砖引玉
此处标志
2.3.2Server类
1.效果图
2.主要成员变量与方法
(1)成员变量
1server是ServerSocket对象,负责等待接收客户的套接请求,当客户请求套接字连接时,server将接收用户的请求,并调用accept()方法返回服务器端所建立的Socket对象you,即建立服务器套接字和客户端套接字的连接。
2you是Socket对象,该对象是驻留在服务器的套接字对象,由server调用accept()方法所返回。
3loginStudent是LinkedList
4yourAdress是InetAddress对象,负责存放客户端的IP。
(2)方法
1Server()是构造方法。
2Server对象调用StartServer(intport)方法相应客户的请求。
3main方法是程序运行的入口方法
3.代码(Server.java)
import.*;
importjava.util.*;
importjava.io.*;
publicclassServer{
ServerSocketserver;
Socketyou;
LinkedList
InetAddressyourAddress;
publicServer(){
System.out.println("我是服务器端程序,负责处理用户的连接请求");
loginStudent=newLinkedList
}
publicvoidstartServer(intport){//该方法相应客户的请求
while(true){
try{
server=newServerSocket(port);
}
catch(IOExceptione1){
System.out.println("正在监听:
");
}
try{System.out.println("等待用户呼叫.");
you=server.accept();//等待客户连接:
接上后才能继续执行下面语句
yourAddress=you.getInetAddress();
System.out.println("客户的IP:
"+yourAddress);
}
catch(IOExceptione){}
if(you!
=null){
newServerThread(you,yourAddress,loginStudent).start();
}
else
continue;
}
}
publicstaticvoidmain(Stringargs[]){
Serverserver=newServer();
server.startServer(6666);
}
}
2.3.3ServerThread类
1.效果图
ServerThread类驻留在服务器端,没有可显示的效果图。
2.主要成员变量与方法
(1)成员变量
1loginStudent是LinkedList
2verifyMess是String字符串,由用户登录时提交的学号、姓名和客户端IP组成。
3socket是Socket对象。
4readTest是ReadTeacherFile对象,负责读取老师文件。
5yourAddress是InetAddress对象,负责存放客户端的IP。
(2)方法
1ServerThread(Socket,InetAddress,LinkedList
2Run()方法是ServerThread类重写父类Thread的方法,给出了怎样响应用户请求的具体内容。
3.代码
importjava.io.*;
import.*;
importjava.util.*;
importjavax.swing.JOptionPane;
publicclassServerThreadextendsThread{
LinkedList
StringverifyMess;//由用户登录时提交的学号、姓名和IP组成
InetAddressyourAddress;
Socketsocket=null;
DataOutputStreamout=null;
DataInputStreamin=null;
ReadTeacherFilereadTest=null;
FilecurrentDir,dirStudent;
booleanisLogin=false;
ServerThread(Sockett,InetAddresss,LinkedList
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=newReadTeacherFile();
}
publicvoidrun(){
Strings="";
while(true){
try{s=in.readUTF();
if(s.startsWith("学生")){
verifyMess=s+""+yourAddress;
Strings0=s.substring
(2);
Filefile=newFile(dirStudent,s0+".txt");//存储学生信息的文件
file.delete();//删除旧的文件
byte[]bb=verifyMess.getBytes();
if(!
(file.exists())){
RandomAccessFileoutNumber=newRandomAccessFile(file,"rw");
outNumber.write(bb);
outNumber.close();
}
if(loginStudent.contains(verifyMess)){
out.writeUTF("已经成功登录了");
break;//如果已经登录过,就消灭因重新登录而创建的当前线程
}
else{
loginStudent.add(verifyMess);
out.writeUTF("成功登录!
"+verifyMess);
//保留首次登录时的线程,当用户突然离线时,该线程将触发IOException
}
}
elseif(s.startsWith("列出文件:
")){
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 out.writeUTF("列出文件: "+fileName[i]); out.writeUTF("已经全部列出: "); } else{out.writeUTF("请登录"); } return; } elseif(s.startsWith("显示内容: ")){ 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); //hhhhhhhhhhhhhhhhhh Strings0=verifyMess.substring(2,verifyMess.indexOf("/")-2)+".txt"; System.out.println(s0); out.writeUTF("内容: "+contentTest+"%"+s0); } else{out.writeUTF("请登录"); } return; } elseif(s.startsWith("评价的结果: ")){ verifyMess=s.substring(s.lastIndexOf(": ")+1,s.lastIndexOf("#")); System.out.println(verifyMess); isLogin=loginStudent.contains(verifyMess); if(isLogin){ StringclientAnswer=s.substring(s.indexOf("#")+1,s.indexOf("@")); StringfileName=verifyMess.substring(2,verifyMess.indexOf("/")-2); Filefile=newFile(dirStudent,fileName+".txt"); RandomAccessFileoutAnswer=newRandomAccessFile(file,"rw"); outAnswer.seek(outAnswer.length()); StringteacherName=s.substring(s.indexOf("@")+1,s.indexOf("$")-4); byte[]bb=("\r\n"+"对"+teacherName+"评价的结果: ").getBytes(); outAnswer.write(bb); bb=clientAnswer.getBytes(); outAnswer.write(bb); outAnswer.close(); } else{out.writeUTF("请登录"); } return; } } catch(IOExceptionee){ try{socket.close(); } catch(Exceptioneee){} loginStudent.remove(verifyMess); System.out.println("客户离开了"); break; } } } } 2.3.4ReadTeacherFile类 1.效果图 ReadTeacherFile类驻留在服务器端,没有可显示的效果图。 2.主要成员变量与方法 (1)成员变量 该类没有成员变量 (2)方法 1getTestContent(File)方法负责读取参数指定的老师文件中的评价内容,即读取老师文件中从第二行以后的全部文本。 2getFalseAnswer(File)方法负责读取参数指定的老师文件中的第一行文本,即全部优秀。 3.代码 importjava.io.*; publicclassReadTeacherFile{ publicStringgetTestContent(Filef){ StringtestContent=""; try{FileReaderin=newFileReader(f); BufferedReaderreader=newBufferedReader(in); StringcorrectAnswer=(reader.readLine()).trim(); StringlineContent=null; StringBuffertemp=newStringBuffer(); while((lineContent=reader.readLine())! =null){ temp.append(lineContent+"\n"); } in.close(); reader.close(); testContent=newString(temp); } catch(IOExceptione){ testContent="没有选择文件"; } returntestContent; } publicStringgetFalseAnswer(Filef){ StringcorrectAnswer=""; try{FileReaderin=newFileReader(f); BufferedReaderreader=newBufferedReader(in); correctAnswer=(reader.readLine()).trim(); in.close(); reader.close(); } catch(IOExceptione){} returncorrectAnswer; } } 2.3.5ClientWindow类 1.效果图 2.主要成员变量与方法 (1)成员变量 1clientLogin是ClientLogin类创建的一个容器,是ClientWindow类的重要成员之一,负责提供登陆界面。 2TabbedPane是JTabbedPane类创建的选项卡容器,负责添加ClientLogin、getTeacherFile和clientTestArea容器。 (2)方法 1ClientWindow()是构造方法,负责完成窗口的初始化。 2Main方法是程序运行的入口。 3.代码 importjava.awt.*; importjava.awt.event.*; importjavax.swing.*; import.*; publicclassClientWindowextendsJFrame{ ClientLoginclientLogin; GetTeacherFilegetTeacherFile; ClientTestAreaclientTestArea; JLabellabel=null; JTabbedPanetabbedPane; publicClientWindow(){ setTitle("XX评课系统(客户端)"); label=newJLabel(); label.setText(getTitle()); label.setForeground(Color.orange); label.setFont(newFont("隶书",Font.BOLD,22)); label.setIcon(newImageIcon("welcome.jpg")); label.setHorizontalTextPosition(SwingConsta
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 标准化 学生 系统