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();
}
}