📄 examclient.java
字号:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.Timer;
import java.util.TimerTask;
public class ExamClient extends Frame implements ActionListener, ItemListener,Runnable { // 客户端
static String url = ""; // 用于存放url的字符串
Panel p1, p2, p3; // p1是左下方的面板,p2是开始考试下面的第一个面板,p3是右下角的面板
Label lab, lab1, lab2; // lab用于提示客户输入IP,lab1用于提示是否连接成功,lab2提示选择试题
TextField tf1, tf2; // tf1用于输入IP,tf2显示时间
Button b1, b2, b3, b4, b5, b6;// b1呼叫,b2将试题文件添加到下拉列表,b3开始考试,b4提交该题答案,b5读取下一题,b6查看得分
Choice c; // 下拉列表框选择试题
int choicenum = 0; // 列表框的数目
int step = 0; // 用于while循环的步骤
TextArea ta1, ta2; // ta1显示答案和分数,ta2显示试题
CheckboxGroup cbg; // 复选框
boolean bConnected = false; // 判断是否连接
boolean isSelected = false; // 判断下拉列表是否可用
boolean success = false; // 文件是否成功传送完毕
Socket socket = null; // socket
Thread threadMessage = null; // 用于控制时间的线程
private DataInputStream inFromServer; // 来自服务器的输入流
private DataOutputStream outToServer; // 发给服务器的输出流
long alltime = 0;
Timer timer = null;
boolean stopwatch = true;
public ExamClient(String title) { // 构造方法
super(title);
timer = new Timer();
threadMessage = new Thread(this);
}
public void startFrame() { // 生成客户端面板的方法
this.setSize(787, 545); // 设置大小
setVisible(true); // 设置可见
setResizable(false); // 不能调整大小
setLayout(null); // 布局管理器为null
addWindowListener(new WindowAdapter() { // 匿名内部类用于监听窗口关闭事件
public void windowClosing(WindowEvent e) {
System.out.println("退出考试系统了!");
disconnect(); // 关闭连接
System.exit(0);
}
});
lab = new Label("输入服务器的IP或域名,如192.168.0.218");// label标签
lab.setBounds(25, 30, 263, 24); // 设置lab的位置和大小
lab.setVisible(true); // 可见
add(lab); // 添加到fram面板
tf1 = new TextField(10); // 文本框
tf1.setBounds(53, 136, 163, 24);
tf1.setVisible(true);
add(tf1);
b1 = new Button("呼叫"); // 呼叫按钮
b1.setBounds(223, 136, 44, 24);
b1.addActionListener(this); // 给"呼叫"按钮注册监视器
b1.setVisible(true);
add(b1);
lab1 = new Label("提示是否连接成功的标签"); // panel里的标签 用于提示登陆信息
lab1.setAlignment(Label.CENTER);
lab1.setBounds(53, 242, 230, 24);
lab1.setVisible(true);
add(lab1);
p1 = new Panel(); // 第一个panel
p1.setBounds(0, 237, 313, 313);
p1.setVisible(false); // 初始不显示,连接成功再显示
lab2 = new Label("选择一个文件后,单击开始考试按钮"); // 第二个标签
lab2.setAlignment(Label.CENTER); // 居中放置
lab2.setBounds(33, 106, 238, 24);
lab2.setVisible(true);
p1.add(lab2); // 将lab2添加到p1
b2 = new Button("将试题文件添加到下拉列表中"); // panel里的按钮,将试题文件添加到下拉列表中
b2.setBounds(14, 214, 202, 24);
b2.setVisible(true);
b2.addActionListener(this); // 给"将试题文件添加到下拉列表中"按钮注册监视器
p1.add(b2);
c = new Choice(); // 下拉列表
c.setBounds(223, 214, 78, 24);
c.addItemListener(this);
p1.add(c);
add(p1);
b3 = new Button("开始考试"); // 右边的组件 第一个按钮
b3.setBounds(320, 26, 467, 28);
b3.setVisible(true);
b3.setEnabled(false);
b3.addActionListener(this); // 给"开始考试"按钮注册监视器
add(b3);
p2 = new Panel(); // 右边的组件 考试下面的第一个panel
p2.setBounds(320, 56, 467, 387);
p2.setVisible(false);
ta1 = new TextArea("单击查看得分按钮,可以在这里看到得分和正确答案");// 用于查看分数的
ta1.setBounds(0, 0, 467, 82);
ta1.setVisible(true);
ta1.setForeground(Color.RED);
p2.add(ta1);
ta2 = new TextArea("你选择了试题:" + "java.txt");// 用于显示试题内容和一些提示
ta2.setBounds(0, 82, 467, 303);
ta2.setVisible(true);
ta2.setForeground(Color.BLUE);
p2.add(ta2);
p3 = new Panel(); // 右边的组件 考试下面的第二个panel
p3.setBounds(320, 440, 467, 108);
p3.setVisible(false);
cbg = new CheckboxGroup();// 单选框
Checkbox cb1 = new Checkbox("A", cbg, true);// 添加A
cb1.addItemListener(this);// 给单选框A注册监视器
Checkbox cb2 = new Checkbox("B", cbg, false);// 添加B
cb2.addItemListener(this);// 给单选框B注册监视器
Checkbox cb3 = new Checkbox("C", cbg, false);// 添加C
cb3.addItemListener(this);// 给单选框C注册监视器
Checkbox cb4 = new Checkbox("D", cbg, false);// 添加D
cb4.addItemListener(this);// 给单选框D注册监视器
cb1.setBounds(16, 18, 30, 20);// 设置位置和大小
cb2.setBounds(56, 18, 30, 20);
cb3.setBounds(96, 18, 30, 20);
cb4.setBounds(136, 18, 30, 20);
cb1.setVisible(true); // 设置初始可见
cb2.setVisible(true);
cb3.setVisible(true);
cb4.setVisible(true);
p3.add(cb1); // 添加到p3
p3.add(cb2);
p3.add(cb3);
p3.add(cb4);
b4 = new Button("提交该题答案");
b4.setBounds(177, 16, 100, 24);
b4.setVisible(true);
b4.addActionListener(this); // 给"提交该题答案"按钮注册监视器
p3.add(b4);
b5 = new Button("读取下一题");
b5.setBounds(284, 16, 87, 24);
b5.setVisible(true);
b5.addActionListener(this); // 给"读取下一题"按钮注册监视器
p3.add(b5);
b6 = new Button("查看得分");
b6.setBounds(378, 16, 73, 24);
b6.setVisible(true);
b6.addActionListener(this); // 给"查看得分"按钮注册监视器
p3.add(b6);
tf2 = new TextField(""); // 用于显示时间的文本框
tf2.setBounds(102, 60, 260, 24);
tf2.setVisible(true);
tf2.setForeground(Color.RED);
p3.add(tf2);
add(p2);
add(p3);
}
public void connect() { // 连接服务器的方法
try {
url = tf1.getText(); // 从tf1取得字符串
socket = new Socket(url, 5000);
inFromServer = new DataInputStream(socket.getInputStream());// 获得输入流
outToServer = new DataOutputStream(socket.getOutputStream());// 获得输出流
// thread = new Thread(this);
System.out.println("正在连接服务器..."); // 提示信息
bConnected = true; // 连接成功
if (socket != null) { // socket不为空时获得IP地址
try {
InetAddress address = socket.getInetAddress();
p1.setVisible(true); // p1显示出来
lab1.setText("您呼叫:" + address + "成功");
System.out.println("连接服务器成功!");
} catch (Exception e) {
System.out.println("找不到您要找的服务器!");
}
}
} catch (Exception e) {
System.out.println("您输入的IP地址有误!请重新输入!"); // 异常输出提示
lab1.setText("您呼叫失败!请重新输入IP地址!");
disconnect(); // 断开连接
System.exit(-1); // 退出客户端
}
}
public void disconnect() { // 断开连接的方法
try {
if (outToServer != null) { // 输出流不为空时关闭
outToServer.close();
}
if (inFromServer != null) { // 输入流不为空时关闭
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -