答题系统的客户端和服务端

Server

public class Server {
	private static BufferedReader br = null;
	private static PrintWriter pw = null;
	private static ServerSocket ss;
	private static Socket s;
	private static ArrayList<Question> questionBank = new ArrayList<Question>();
	private static ArrayList<Question> cloneArrayList = new ArrayList<>();// 克隆一份题库,将选择的题目重中删除,避免选题重复
	private static ArrayList<String> answerArrayList = new ArrayList<>();// 用于存放试卷的答案
	private static ArrayList<String> personAnswerArrayList = new ArrayList<>();// 用于存放同学的答案
	private static double result=0;//成绩
	static Scanner scanner = new Scanner(System.in);

public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 用Set集合作为题库

		try {
			ss = new ServerSocket(5500);
			System.out.println("服务器正常启动。。。。");
			s = ss.accept();// 阻塞方法
			System.out.println("连接成功" + s.getRemoteSocketAddress());
			br = new BufferedReader(new InputStreamReader(s.getInputStream()));//输出流
			pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));//输入流

			Class.forName("com.mysql.cj.jdbc.Driver");// 加载驱动
			String jdbc = "jdbc:mysql://localhost:3306/person?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
			Connection conn = DriverManager.getConnection(jdbc, "root", "root");// 链接到数据库
			Statement state = conn.createStatement(); // 容器
			String sql = "select * from question"; // sql语句
			ResultSet rs = state.executeQuery(sql); // 将sql语句传至数据库,返回的值为一个字符集用一个变量接收
//			while(rs.next()){ //next()获取里面的内容
//			System.out.println(rs.getString(1)+"  "+rs.getString(2));
//			}
			// getString(n)获取第n列的内容
			// 数据库中的列数是从1开始的

			
			System.out.println("发送题目......");
			while (rs.next()) {// 将题目和答案存在set集合中
				questionBank.add(new Question(rs.getString(2), rs.getString(3)));
			}
			

			sql="delete from test";
			state.executeUpdate(sql);
			
			//关闭数据库和容器连接
			state.close();
			conn.close();
			
			Random random = new Random();// 生成随机数
			
			cloneArrayList = questionBank;
			int i=0;
			while (i<3) {
				System.out.println(i);
				int ran = random.nextInt(3);// 随机选择题目
				pw.println(cloneArrayList.get(ran).getTitle());// 将题目刷到缓冲中
				pw.flush();
				answerArrayList.add(cloneArrayList.get(ran).getAnswer());//将选择题目的答案存入列表中
				//将试卷添加到数据库中,方面同学查看试卷
				String titlrString=cloneArrayList.get(ran).getTitle();
				String answerString=cloneArrayList.get(ran).getAnswer();
				Class.forName("com.mysql.cj.jdbc.Driver");// 加载驱动
				String jdbc1 = "jdbc:mysql://localhost:3306/person?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
				Connection conn1 = DriverManager.getConnection(jdbc1, "root", "root");
				java.sql.Statement state1 = conn1.createStatement(); // 容器
				String sqlString = "insert into test(title,answer) values('" + titlrString + "','"
						+ answerString + "')";//将试卷存入数据库test中
				state1.executeUpdate(sqlString); // 将sql语句上传至数据库执行
				state1.close();
			    conn1.close();
				String string = br.readLine();
//				System.out.println("Server读到:" + string);
				personAnswerArrayList.add(string);// 将取得的答案存到arraylist集合中
				cloneArrayList.remove(ran);//将选择的题目从克隆题目列表中移除,避免选择重复题目
				i++;
				Class.forName("com.mysql.cj.jdbc.Driver");// 加载驱动
				String jdbc11 = "jdbc:mysql://localhost:3306/person?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
				Connection conn11 = DriverManager.getConnection(jdbc11, "root", "root");
				java.sql.Statement state11 = conn11.createStatement(); // 容器
				sqlString = "update test set your='"+string+"' where title='"+titlrString+"'";//将同学作答结果存入数据库test中
				state11.executeUpdate(sqlString); // 将sql语句上传至数据库执行
				state11.close();
			    conn11.close();
			}
		
//			
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		//得到同学的成绩
//		System.out.println(answerArrayList);
//		System.out.println(personAnswerArrayList);
		for (int i = 0; i <answerArrayList.size(); i++) {
			double every=100/answerArrayList.size();
			if(answerArrayList.get(i).equals(personAnswerArrayList.get(i))) {
				result=result+every;
			}
		}	
//		System.out.println(result);
		pw.println(String.valueOf(result));//将成绩刷到缓冲区
		pw.flush();
		try {
			pw.close();
			br.close();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
	}
	}

在这里插入图片描述

Client

public class Client {
	private static PrintWriter pw = null;
	private static BufferedReader br = null;
	private static Socket s;
	private static int IsOk = 0;// 判断是否登入
	private static int IsQuestion = 0;// 判断是否答题
	static Scanner scanner = new Scanner(System.in);

	/**
	 * @param args
	 */

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			Socket s = new Socket(InetAddress.getLocalHost(), 5500);
			pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
			br = new BufferedReader(new InputStreamReader(s.getInputStream()));
			int flag = HomePage();
			while (flag != 5) {
				switch (flag) {
				case 1:// 登入
					Login();
					flag = HomePage();
					break;
				case 2:// 注册
					Register();
					flag = HomePage();
					break;
				case 3:// 答题
					Question();// 只有确认登入isok=1的时候才可以进行答题
					flag = HomePage();
					break;
				case 4:// 试卷查询
					Serach();
					flag = HomePage();
					break;
				case 5:
					break;
				default:
					System.out.println("请重新输入");
					flag = HomePage();
					break;
				}
			}
			System.out.println("成功退出");
			IsOk = 0;

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			br.close();
			pw.close();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}

	private static void Serach() throws SQLException {
		// TODO Auto-generated method stub
		if (IsQuestion == 0) {
			System.out.println("还未答题,请先答题");
		} else {
			// 返回试卷,和答案
//			System.out.println(cloneArrayList);
			try {
				Class.forName("com.mysql.cj.jdbc.Driver");
				String jdbc = "jdbc:mysql://localhost:3306/person?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
				Connection connection = DriverManager.getConnection(jdbc, "root", "root");
				String sqlString = "select * from test";
				PreparedStatement state = connection.prepareStatement(sqlString);
				ResultSet resultSet = state.executeQuery();
//				2.1 ResultSet 对象具有指向其当前数据行的光标。
//				最初,光标被置于第一行之前。调用 next() 方法将光标移动到下一行;
//				next()方法一开始是处于第一行之前,即beforeFirst,
//				第一次使用next()就将指针指向返回结果集的第一行。
//				每使用一次next(),指针就指向下一行。
//			       因为该方法在 ResultSet 对象没有下一行时返回 false, 
//				所以可以在 while 循环中使用它来迭代结果集,
//				调用getXXX(int fieldIndex)/getXXX(String columnName)方法获取字段值。
				System.out.println("*************************试卷*********************************");
				while(resultSet.next()){
			        String title = resultSet.getString(1);
			        String answer = resultSet.getString(2);
			        String yourString=resultSet.getString(3);
			        System.out.println(title);
			        System.out.println("答案:"+answer);
			     System.out.println("你的答案:"+yourString);
				}
				System.out.println("*************************************************************");
				state.close();
				connection.close();
				
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} // 加载驱动
			

		}

	}

	private static void Question() {
		// TODO Auto-generated method stub
		
		if (IsOk != 1) {
			System.out.println("还未登入,请先登入");
		} 
//		else if (IsQuestion == 1) {
//			System.out.println("答题已结束");
//		}
	else {
			System.out.println("等待发卷......");
			String string;
			try {
				for (int i = 0; i < 3; i++) {// 选取三道题
					string = br.readLine();// 读取题目
					System.out.println(string);// 将题目输出
					System.out.println("请输入答案:");
					String str = scanner.next();
					pw.println(str);// 将答案上传到服务端
					pw.flush();
					IsQuestion = 1;
				}
				System.out.print("答题结束,你的成绩为:");
				String result = br.readLine();
				System.out.println(result);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

	private static void Register() {
		// TODO Auto-generated method stub
		System.out.println("账号:");
		String usernameString = scanner.next();
		System.out.println("密码:");
		String passworkString = scanner.next();
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");// 加载驱动
			String jdbc = "jdbc:mysql://localhost:3306/person?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
			Connection conn = DriverManager.getConnection(jdbc, "root", "root");
			java.sql.Statement state = conn.createStatement(); // 容器
			String sqlString = "insert into client(username,passwork) values('" + usernameString + "','"
					+ passworkString + "')";
			state.executeUpdate(sqlString); // 将sql语句上传至数据库执行
			System.out.println("注册成功");
			state.close();
			conn.close();
		} catch (Exception e) {
			System.out.println("注册失败");

		}
	}

	public static int HomePage() {
		System.out.println("*******************************主页面*******************************");
		System.out.println(
				"*                                                                请输入flag                                 *");
		System.out.println("*                        1.登入                                    *");
		System.out.println("*                        2.注册                                    *");
		System.out.println("*                        3.答题                                    *");
		System.out.println("*                        4.成绩查询                                *");
		System.out.println("*                        5.退出                                    *");
		System.out.println("********************************************************************");
		System.out.print("flag=");
		int flag = scanner.nextInt();
		return flag;
	}

	public static void Login() {
		// 连接数据库mysql
		// 声明Connection对象
		System.out.println("账号:");
		String usernameString = scanner.next();
		System.err.println("密码:");
		String passworkString = scanner.next();
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");// 加载驱动
			String jdbc = "jdbc:mysql://localhost:3306/person?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
			Connection conn = DriverManager.getConnection(jdbc, "root", "root");// 链接到数据库

			String sql = "select * from client where username=? and passwork=?";
			PreparedStatement state = conn.prepareStatement(sql);
			state.setString(1, usernameString);
			state.setString(2, passworkString);
			ResultSet resultSet = state.executeQuery();
			if (resultSet.next()) {
				System.out.println("登入成功," + resultSet.getString(1) + "欢迎你");
				IsOk = 1;
			} else {
				System.out.println("登入失败。账号或密码有误");
			}
			resultSet.close();
			conn.close();
		} catch (Exception e) {
			System.out.println("数据库连接错误");
		}

	}

}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Question

public class Question {
	
	private String title;//题干
    private String answer;//正确答案

    public Question(String title,String answer){
    	
        this.title=title;
        this.answer=answer;
    }
    
    public String getTitle() {
        return this.title;
    }
    public String getAnswer(){
        return this.answer;
    }

    //要重写equals方法以及hashCode方法,才能在set集合中保证题目不重复
    @Override
    public boolean equals(Object obj) {
        if(this==obj)
            return true;
        if(obj instanceof Question){
            Question anotherQuestion=(Question)obj;
            //比较题干是否相同
            if(this.getTitle().equals(anotherQuestion.getTitle()))
                return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        return this.getTitle().hashCode();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值