⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 examclient.java

📁 c/s客户端服务器的在线考试系统内含源码和试题
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				inFromServer.close();
			}
			if (socket != null) {									// socket不为空时关闭
				socket.close();
			}
		} catch (IOException e) {
			System.out.println("退出时发生异常!");
		}
	}

	public void actionPerformed(ActionEvent e) {	 // 监听
		if (e.getSource() == b1) {
			connectButtonPerformed();				// 这个给"呼叫"按钮响应的方法
		}
		if (e.getSource() == b2) {
			selectButtonPerformed();				// 这个给"将试题文件添加到下拉列表中"按钮响应的方法
		}
		if (e.getSource() == b3) {
			startButtonPerformed(); 				// 这个给"开始考试"按钮响应的方法
			// testTimerPerformed();
		}
		if (e.getSource() == b4) {
			answerButtonPerformed();				 // 这个给"提交该题答案"按钮响应的方法
		}
		if (e.getSource() == b5) {
			questionButtonPerformed();				 // 这个给"读取下一题"按钮响应的方法
		}
		if (e.getSource() == b6) {
			scoreButtonPerformed(); 				// 这个给"查看成绩"按钮响应的方法
		}
	}

	public void connectButtonPerformed() { 			// b1"呼叫"的响应方法
		b2.setEnabled(true);						// 呼叫成功后"将试题文件添加到下拉列表中"按钮可用
		connect();
	}

	public void selectButtonPerformed() { 			// b2"将试题文件添加到下拉列表中"的响应方法
		b3.setEnabled(false);						// 没选择试题前开始考试按钮不可用
		try {
			outToServer.writeUTF("将试题文件添加到下拉列表中");
			String s = null;
			c.removeAll();							// 先清空下拉列表框的内容
			step = 0;
			while (step == 0) {						// 控制循环传送完毕后退出
				try { 								// 从服务器读取试题名称
					s = inFromServer.readUTF();		// 读取输入流
					if (s.startsWith("试题文件@")) {	// 客户端发送的字符串以"试题文件@"开头的则执行以下代码
						String listItem = s.substring(s.indexOf("@") + 1);
						c.add(listItem);			// 将读取到的文件名添加到下拉列表
						isSelected = true;			// 下拉列表可用
					}
					if (s.startsWith("传送完毕@")) {	// 客户端发送的字符串以"传送完毕@"开头的则执行以下代码
						success = true;				// 文件传送成功
						System.out.println("接收文件完毕");
						break;						// 接收完毕跳出循环
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		} catch (Exception e) {
			System.out.println("向服务器写\"将试题文件添加到下拉列表中\"失败");
		}
	}

	public void startButtonPerformed() { 			// b3"开始考试"的响应方法
		b3.setEnabled(false);						// 开始考试后设置不可重用
		b5.setEnabled(true);						// 读取下一题设置为可用
		try {
			System.out.println("你点了开始考试");
			threadMessage.start();					// 开始考试后,线程开始执行
			p2.setVisible(true);
			p3.setVisible(true);
			b4.setEnabled(false);
			ta2.setText("你选择了试题:" + c.getSelectedItem());// 在ta2中提示选择了哪套试题
		} catch (Exception e) {
			System.out.println("向服务器写\"开始考试\"失败");
		}
	}

	public void answerButtonPerformed() { 			// b4"提交该题答案"的响应方法
		String answer = "";
		b5.setEnabled(true);
		b4.setEnabled(false);
		try {
			answer = cbg.getSelectedCheckbox().getLabel();	// 从单选框获取提交答案时当前选项
			try {
				System.out.println(answer);
				outToServer.writeUTF("提交该题答案:" + answer);// 传送给服务器
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (Exception e) {
			System.out.println("向服务器\"提交该题答案\"失败");
		}
	}

	public void questionButtonPerformed() { 				// b5"读取下一题"的响应方法
		try {
			b5.setEnabled(false);
			b4.setEnabled(true);
			try {
				outToServer.writeUTF("读取下一题");			// 将要读题的信息发送给服务器
			} catch (Exception event) {
			}
		} catch (Exception e) {
			System.out.println("向服务器写\"读取下一题\"失败");
		}
	}

	public void scoreButtonPerformed() {					 // b6"查看成绩"的响应方法
		try {
			outToServer.writeUTF("查看成绩");					// 将要查看成绩的信息发送给服务器
		} catch (Exception e) {
			System.out.println("要求服务器发送\"查看成绩\"失败");
		}
	}

	private String remainTime(long time) { 					// 显示剩余时间的方法
		long leftTime = time / 1000;
		long leftHour = leftTime / 3600;
		long leftMinute = (leftTime - leftHour * 3600) / 60;
		long leftSecond = leftTime % 60;
		String timeString = "剩余时间" + leftHour + "小时 " + leftMinute + "分 "
				+ leftSecond + "秒 ";
		return timeString;
	}

	public void testTimerPerformed() { 						// 开始显示更新时间的方法
		alltime -= 1;
		if (alltime <= 0) {						// 剩余时间小于或等于0时停止考试,按钮设置为不可用
			stopwatch = false;					// 计时监视器设置为false,不再显示更新时间
			b4.setEnabled(false);
			b5.setEnabled(false);
			timer.cancel();						// 为什么cancel方法没起作用?
		}
		tf2.setText(remainTime(alltime));		// 剩余时间大于0时显示更新时间
	}

	public void run() {							// run方法
		while (step == 1) {						// 当step为1时一直监听服务器发送来的信息
			String s = null;
			try {
				s = inFromServer.readUTF();		// 读取从服务器发送来的信息
				if (s.startsWith("文件内容")) {	// 如果文件以"文件内容"开头则读取到ta2文本区
					String content = s.substring(s.indexOf(":") + 1);
					ta2.setText(s);
				}
				if (s.startsWith("你的成绩是")) {	// 如果文件以"你的成绩是"开头则将成绩读取到ta1文本区
					ta1.setText("\n" + s);
				}
				if (s.startsWith("考试时间:")) {	// 如果文件以"考试时间:"开头则将时间读取到tf2
					System.out.println("读取到考试时间了");	// 打印在控制台的提示信息
					String str = s.substring(s.indexOf(":") + 1);// 获取服务器发来的时间信息(String)类型
					alltime = Long.parseLong(str);			// 转换为Long型
					timer.schedule(new TimerTask() 	// 计时器安排指定的任务在指定的时间开始进行重复的固定延迟执行
							{ 						// 内部类实现
								public void run() { // run方法,当计时监视器没有被设置为false时显示更新时间
									while (stopwatch == true) {// 剩余时间小于等于0或考试结束为false
										testTimerPerformed();// 调用在tf2显示更新时间的方法
									}
								}
							}, 1, 1000); 	// 1是延迟1毫秒执行schedule方法,1000是执行各后续任务之间的时间间隔
				}
				if (s.startsWith("考试结束")) {// 如果文件以"考试结束"开头则提示信息并把b4,b5设置为不可用
					ta2.setText("考试已经结束!\n请选择\"查看得分\"按钮或重新选择试题开始考试!");
					stopwatch = false;		// 将计时监视器设置为false,不再显示更新时间
					b4.setEnabled(false);
					b5.setEnabled(false);
					timer.cancel();			// 终止计时器
				}
			} catch (Exception e) {
				ta2.setText("从服务器读取信息异常!");
			}
		}
	}

	public void itemStateChanged(ItemEvent e) {
		if (e.getSource() == c) { 						// 这个给"下拉列表"框响应的方法
			b3.setEnabled(true);
			choicenum = c.getItemCount();
			if (choicenum >= 1 && isSelected == true) {	// 下拉列表框选项大于0并且可用时执行以下代码
				String listItem = c.getSelectedItem();	// 取得下拉列表框中选中的文件名
				step = 1; 								// 选择了文件之后将step设置为1开始执行run方法
				try {
					outToServer.writeUTF("选择试题:" + listItem);// 将选中的试题文件名发送给服务器
					System.out.println("选择试题:" + listItem);	// 在客户端的控制台提示信息
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
		if (e.getSource() == cbg) {								// 监听单选框
			String s = cbg.getSelectedCheckbox().getLabel();	// 获得选中的单选框选项
			System.out.println("选择了" + s);
		}
	}

	public static void main(String[] args) { 					// main方法
		ExamClient ec = new ExamClient("标准化考试系统");			// new一个客户端
		ec.startFrame();										// 调用生成客户端面板的方法
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -