📄 examclient.java
字号:
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 + -