java大作业实验报告
计算机网络程序设计课程设计报告题目: 学生成绩网上查询 学 院 计算机学院 专 业 网络工程 班 级 1班 姓 名 刘小芳 学 号 同组人姓名 张晶晶 同组人学号 指导教师 薛涛 2013年 12 月 20 日一、任务概述1.1 编写目的本课程设计是通过对传输层协议 TCP 和 UDP 和客户/服务器数据通信的原理及方式的掌握,采用 Java 语言,利用套接字 Socket 编写出指定题目的交互信息的软件。通过本次课程设计主要有以下目的:(1) 加深对计算机网络的基本概念和原理,以及网络编程接口套接字 Socket 概念及编程原 理的理解;(2) 提高学生网络应用与编程的能力。学生在参考设计题目中选择一个,也可自拟题目, 提高其分析与解决问题的能力,为大型网络编程打下坚实基础;(3) 通过撰写课程设计报告,锻炼学生的逻辑组织和语言表达能力;(4) 培养学生理论运用于实践的综合应用和设计创新能力。1.2 项目任务和要求学生成绩网上查询服务器端: 接收客户端的查询请求,验证客户身份,如通过身份验证,则将客户要查询的科目成绩返回 客户端。(客户身份数据及成绩数据均为虚拟数据,可自行编制,客户身份至少应有客户 ID (或学号)、客户密码(登录密码),学生成绩至少应有课程号(或课程名)、客户 ID、成 绩,所有字段的数据类型可自行设计)。客户端: 以命令方式接收用户键盘输入,通过服务器查询成绩。1.3 参考资料Java应用开发与实践 人民邮电出版社Java程序设计实用教程清华大学出版社Java编程技术基础 清华大学出版社Java实践教程清华大学出版社1.4任务分工刘小芳:程序设计编码及需求分析;张晶晶:编写报告二、开发环境操作系统:windows 7编程工具:myeclipse开发语言:JAVA机器的IP地址:192.168.1.1023、 项目需求分析3.1基本设计需求分析1)、为每个使用系统的人员设置权限,只有通过权限验证的人才能使用系统;2)、学生可以使用该系统查询所学课程的成绩和修改自己的信息;3)、教师使用该系统完成学生成绩的录入、修改、显示;4)、管理员使用该系统对学生信息、教师信息、院系信息、班级信息、课程信息进行增删查改。教师模块管理员模块学生模块参与者 功能模块3.2 各模块详细功能如下:登陆找回密码身份验证录入信息修改信息管理员模块查询信息删除信息密码找回身份验证登陆查询学生信息教师模块删除学生信息修改学生信息密码找回身份验证登陆修改个人基本信息学生模块成绩查询3.3录入成绩用例:1、简要说明:本用例描述了教师对课程的成绩的录入。2、事件流:(1)、基本流:1)、选择课程名称;2)、录入课程成绩;3)、系统更新课程成绩;4)、系统显示该课程成绩;5)、教师确认保存录入课程成绩;6)、系统保存教师所录入的成绩。(2)、备选流:1)、如果没有要选择的课程名称,给出提示,结束;2)、如果教师没有确认保存录入成绩,给出提示,结束。3.4、类图和对象图的绘制类属性操作学生选课图:学生成绩管理类图:对象类图:管理员管路信息类图:4、 项目设计说明:由于时间短,并且个人能力目前还达不到那样的高度,所以实际的项目无法实现上述分析的功能。流程图:服务器端:开始客户机端:运行客户端结束获取成绩信息身份验证登陆开始运行服务器开始监听失败是否有消息无成功有查询数据库,显示结果返回数据库设计student表:用于存放学生的基本信息注释:Num 代表学号;Name 代表姓名;Pwd 代表登陆密码;Course表:用于存放学生的成绩注释:Cname 代表课程名Sname 代表学生姓名;Chengji 代表学生成绩;主要类实现:(1)Course类:package com.entity;public class Course String Name;int score;public String getName() return Name;public void setName(String name) Name = name;public int getScore() return score;public void setScore(int score) this.score = score;(2)Student类:package com.entity;public class Student int Num;String Name;String Pwd;public int getNum() return Num;public void setNum(int num) Num = num;public String getName() return Name;public void setName(String name) Name = name;public String getPwd() return Pwd;public void setPwd(String pwd) Pwd = pwd;五、程序的运行和测试结果1. 登录界面:2. 登录失败:3. 登录成功后的成绩查询:6、 实验中的问题及心得6.1收获:通过这次课程设计,应用了传输层协议 UDP和客户/服务器数据通信的原理,加深了我们对计算机网络的基本概念和原理以及网络编程接口套接字 Socket 概念及编程原 理的理解;掌握了 Java 应用程序设计的基础知识;加深了对 TCP/IP 协议的理解;掌握 了C/S 编程模式;掌握 了Socket 机制。使我们进一步理解、领会 Java 语言和网络编程技术,把所学的知识运用到具体的程序设计当中去,提高了我分析与解决问题的能力,为以后大型网络编程打下了基础。6.2遇到的问题:A. 数据库的连接B. 定位主机C. 数据传输不过最后还是通过查询各种自理哦啊和问同学解决了。7、 附录:程序清单(1)Course类:package com.entity;public class Course String Name;int score;public String getName() return Name;public void setName(String name) Name = name;public int getScore() return score;public void setScore(int score) this.score = score;(2)Student类:package com.entity;public class Student int Num;String Name;String Pwd;public int getNum() return Num;public void setNum(int num) Num = num;public String getName() return Name;public void setName(String name) Name = name;public String getPwd() return Pwd;public void setPwd(String pwd) Pwd = pwd;(3)BaseDao类:package com.dao;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class BaseDao private final String BD_DRIVER = com.microsoft.sqlserver.jdbc.SQLServerDriver;private final String BD_URL = jdbc:sqlserver:/localhost:1433;DatabaseName=class;private final String BD_USER = sa;private final String BD_PWD = sasa;public Connection conn = null;public PreparedStatement psta = null;public ResultSet res = null;public void getConn() / TODO Auto-generated method stubtry Class.forName(BD_DRIVER);conn = DriverManager.getConnection(BD_URL, BD_USER, BD_PWD); catch (Exception ex) / TODO Auto-generated catch blockex.printStackTrace();public ResultSet executeQuery(String sql, Object para) try getConn();psta = conn.prepareStatement(sql);if (para != null) for (int i = 0; i para.length; i+) psta.setObject(i + 1), parai);res = psta.executeQuery(); catch (Exception ex) ex.printStackTrace();return res;public void closeAll(Connection conn, PreparedStatement psta, ResultSet res) try if (res != null) res.close();if (psta != null) psta.close();if (conn != null) conn.close(); catch (Exception ex) ex.printStackTrace();(4)CourseDaoImpl类:package com.dao.impl;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import com.dao.BaseDao;import com.entity.Course;public class CourseDaoImpl extends BaseDao public String chaxun(String sName) String sql = select * from course where sName=?;Object para = sName;res = executeQuery(sql, para);String s = ;try while (res.next() s=s+res.getString(cName);s=s+,;s=s+String.valueOf(res.getInt(chengji);s=s+; catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();finallythis.closeAll(conn, psta, res);return s;(5)StudentDaoImpl类:package com.dao.impl;import java.sql.SQLException;import com.dao.BaseDao;public class StudentDaoImpl extends BaseDao public int chaxun(String Name, String Pwd) int i = 0;String sql = select * from student where Name=? and Pwd=? ;Object para = Name, Pwd ;res = executeQuery(sql, para);try if (res.next() i = 1; catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();return i;(6)Transform类:package com.comm;public class Transform public Object change(String str) Object obj;String obj1 = str.split(;);obj = new Objectobj1.length;for (int i = 0; i obj1.length; i+) String obj2 = obj1i.split(,);obji = new Objectobj2.length;for (int j = 0; j obj2.length; j+) objij = obj2j;return obj;(7)Server类:package com.dao.impl;import java.net.*;public class Server public static void main(String args) try DatagramSocket Socket = new DatagramSocket(5000);byte buf = new byte1024;DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);boolean g = true;while (g) Socket.receive(receivePacket);String name = receivePacket.getAddress().toString();System.out.println(n来自主机: + name + n端口:+ receivePacket.getPort();String str = new String(receivePacket.getData(), 0,receivePacket.getLength();System.out.println(str);String str1 = str.split(&);/ str10命令,str11名字StudentDaoImpl sd = new StudentDaoImpl();int i = 0;i = sd.chaxun(str10,str11);if (i=0) functionSend(Socket, String.valueOf(i); else CourseDaoImpl cd = new CourseDaoImpl();String string=cd.chaxun(str10);functionSend(Socket, string);Socket.close(); catch (Exception e) e.printStackTrace(); public static void functionSend(DatagramSocket Socket, String string) byte databyte = new byte100;databyte = string.getBytes();DatagramPacket sendPacket;try sendPacket = new DatagramPacket(databyte, databyte.length,InetAddress.getByName(127.0.0.1), 4444);Socket.send(sendPacket); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();(8)Login类:package com.jiemian;import java.awt.BorderLayout;import java.awt.Container;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JTextField;import com.dao.impl.StudentDaoImpl;public class Login extends JFrame public JFrame frame = new JFrame(登录);public Container c = frame.getContentPane();public JTextField Name = new JTextField();public JPasswordField Pwd = new JPasswordField();public JButton ok = new JButton(确定);public JButton cancel = new JButton(取消);public String initFrame() frame.setSize(300,200);c.setLayout(new BorderLayout();frame.setVisible(true);/顶部JPanel titlePanel = new JPanel();titlePanel.setLayout(new FlowLayout();titlePanel.add(new JLabel(学生成绩查询系统登录);c.add(titlePanel,North);/中部表单JPanel fieldPanel = new JPanel();fieldPanel.setLayout(null);JLabel l1 = new JLabel(用户名:);l1.setBounds(50, 20, 50, 20);JLabel l2 = new JLabel(密 码:);l2.setBounds(50, 60, 50, 20);fieldPanel.add(l1);fieldPanel.add(l2);Name.setBounds(110,20,120,20);Pwd.setBounds(110,60,120,20);fieldPanel.add(Name);fieldPanel.add(Pwd);c.add(fieldPanel,Center);/底部按钮JPanel buttonPanel = new JPanel();buttonPanel.setLayout(new FlowLayout();buttonPanel.add(ok);ok.addActionListener(new ActionListener() Overridepublic void actionPerformed(ActionEvent e) try DatagramSocket Socket = new DatagramSocket(4444);/ 4444为客户端绑定的端口号boolean g = true;while (g) String string = Name.getText()+&+ Pwd.getText();byte databyte = new byte1024;databyte = string.getBytes();DatagramPacket sendPacket = new DatagramPacket(databyte,databyte.length, InetAddress.getByName(127.0.0.1),5000);Socket.send(sendPacket);byte rbuf = new byte1024;DatagramPacket receivePacket = new DatagramPacket(rbuf,rbuf.length);Socket.receive(receivePacket);String data = new String(receivePacket.getData(), 0,receivePacket.getLength();if(data.equals(0)JOptionPane.showMessageDialog(frame, 用户名与密码不匹配,请重新输入!);g=false;frame.dispose();new Login().initFrame();elseg=false;frame.dispose();new xianshi(data);Socket.close(); catch (Exception e1) e1.printStackTrace(););buttonPanel.add(cancel);cancel.addActionListener(new ActionListener() Overridepublic void actionPerformed(ActionEvent e) System.exit(0););c.add(buttonPanel,South);return null;public static void main(String args)new Login().initFrame();(9)Xianshi类:package com.jiemian;import java.awt.BorderLayout;import java.awt.Container;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.List;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.JTextField;import javax.swing.table.TableColumn;import com.comm.Transform;import com.dao.impl.CourseDaoImpl;import com.entity.Course;public class xianshi extends JFramepublic xianshi(String str) intiComponent(str); /* * 初始化窗体组件 */ private void intiComponent(String str) /* * 设置JTable的列名 */ String columnNames = 课程, 成绩; System.out.println(str);Object obj =new Transform().change(str); /* * JTable的其中一种构造方法 */ JTable table = new JTable(obj, columnNames); /* * 设置JTable的列默认的宽度和高度 */ TableColumn column = null; int colunms = table.getColumnCount(); for(int i = 0; i colunms; i+) column = table.getColumnModel().getColumn(i); /*将每一列的默认宽度设置为100*/ column.setPreferredWidth(100); /* * 设置JTable自动调整列表的状态,此处设置为关闭 */ table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); /*用JScrollPane装载JTable,这样超出范围的列就可以通过滚动条来查看*/ JScrollPane scroll = new JScrollPane(table); scroll.setSize(300, 200); Container c = this.getContentPane();JButton cancel = new JButton(返 回);JPanel buttonPanel = new JPanel();buttonPanel.setLayout(new FlowLayout();buttonPanel.add(cancel);cancel.addActionListener(new ActionListener() Overridepublic void actionPerformed(ActionEvent e) dispose();new Login().initFrame(););c.add(buttonPanel,South);add(scroll); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack();