package com.softeem.myitem.test; import java.io.*; import java.net.Socket; import java.util.Enumeration; import java.util.Iterator; import java.util.Properties; import java.util.Set; /** * @author xuziqian * 知识问答器 * */ public class MyQuestionAnswerSystem implements Runnable { private Socket socket = null; private PrintStream ps = null; private BufferedReader br = null; private static Properties alluser = new Properties();// 普通用户 private static Properties allquestions = new Properties();// 问题 private static Properties admin = new Properties();// 管理员 static { try { alluser.load(new FileInputStream("user.properties"));// 加载普通用户。 allquestions.load(new FileInputStream("questions.properties"));// 加载所有问题和答案 admin.load(new FileInputStream("admin.properties"));// 加载管理员 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public MyQuestionAnswerSystem(Socket socket) { this.socket = socket; } public void run() { inRun(); } private void inRun() { try { ps = new PrintStream(socket.getOutputStream());// 初始化流。 br = new BufferedReader(new InputStreamReader(socket .getInputStream())); welCome(); } catch (IOException e) { e.printStackTrace(); } } private void welCome() { ps.println("欢迎来到***的知识问答系统!"); ps.println(); ps.println(); ps.println("*******************"); ps.println(" &欢迎您答题&"); ps.println("*******************"); ps.flush(); ps.println("1:新用户注册"); ps.flush(); ps.println("2:老用户登陆"); ps.flush(); ps.println("3:退出本系统"); ps.flush(); try { String line = null; while ((line = br.readLine()) != null) { if ("1".equalsIgnoreCase(line.trim())) { nerLogin(); } else if ("2".equalsIgnoreCase(line.trim())) { doOlderUser(); break; } else if ("3".equalsIgnoreCase(line.trim())) { doQuit(); } } } catch (IOException e) { e.printStackTrace(); } } private void doOlderUser() {// 老用户登陆 ps.println("请您选择正确的身份进行验证"); ps.println("1:普通用户登陆(默认)"); ps.println("2:管理员登陆"); ps.println(); ps.flush(); String s; try { s = br.readLine(); if ("2".equalsIgnoreCase(s))// 管理员登陆 { if (chekPass()) { quesPutIn(); return; } } else {// 普通用户登陆 if (chekPass()) { sendQuestion(); } } } catch (IOException e) { e.printStackTrace(); } } private void quesPutIn() { ps.println("a.录入题目"); ps.println("b.查阅所有题目"); ps.println("c.退出系统"); try { String s=null; boolean blo=true; s=br.readLine(); if("a".equalsIgnoreCase(s)){//录入题目。 ps.println("请输入题目且用用 = 号把题目和答案分开"); while(true) { String qus[]=br.readLine().split("="); allquestions.put(qus[0], qus[1]); ps.println("继续录入题目吗(y/n)?"); System.out.println(qus[0].toString()); String s2=br.readLine(); if("y".equalsIgnoreCase(s2)) { ps.println("继续输入"); }else if("n".equalsIgnoreCase(s2)){ doQuit(); break; } } allquestions.store(new PrintStream(new FileOutputStream("questions.properties")),null); }else if("b".equalsIgnoreCase(s))//查询所以题目。 { Enumeration en=allquestions.keys(); while(en.hasMoreElements()) { String question=(String)en.nextElement(); ps.println("题目是"+question+" = "+allquestions.getProperty(question)); ps.println(); ps.flush(); } doQuit(); }else if("c".equalsIgnoreCase(s)) { doQuit(); } } catch (IOException e) { e.printStackTrace(); } } private void doQuit() { ps.println("感谢您的使用,谢谢!"); ps.close(); try { br.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } public void nerLogin()// 用户注册模块! { try { ps.println("请输入您要注册的用户名:"); String name = br.readLine();// 读入用户名,并存储。 while (alluser.containsKey(name))// 判断该用户是否已经存在! { ps.println("该用户名已经被占用,请您重新输入!"); name = br.readLine(); } ps.println("请输入密码:"); String num1 = br.readLine(); ps.println("请再次输入密码:"); ps.flush(); String num2 = br.readLine(); if (num1.equalsIgnoreCase(num2)) { alluser.put(name, num1); alluser.store(new FileOutputStream("user.properties"), null); ps.println("恭喜您注册成功!"); ps.flush(); sendQuestion();// 开始答题了! } } catch (IOException e) { e.printStackTrace(); } } private void sendQuestion()// 答题模块 { ps.print("试题正在加载中"); for (int i = 0; i < 6; i++) { try { Thread.sleep(500); ps.print("."); ps.flush(); } catch (InterruptedException e) { e.printStackTrace(); } } ps.println(); Set quests = allquestions.keySet();// 把试题的导入到Set中。 Iterator it = quests.iterator(); String question = null; int count = 0; int score = 0; while (it.hasNext() && count < 10) { question = (String) it.next();// 获取试题 count++; ps.println(question); try { String answer = br.readLine(); String rightanswer = allquestions.getProperty(question); if (rightanswer.equalsIgnoreCase(answer)) { score += 10; ps.println("恭喜您答对了!"); ps.flush(); } else { ps.println("您答错了!" + "" + rightanswer); ps.flush(); } } catch (IOException e) { e.printStackTrace(); } } ps.println("您的得分是:" + score + "正确率是:" + score * 100 / 100.0 + "%"); ps.flush(); } public boolean chekPass() {//密码验证模块 boolean chek = false; int k = 0; try { ps.println("请输入用户名:"); String name = br.readLine();// 读入用户名,并存储。 String pass = null; while(true) { k++; if (alluser.containsKey(name))// 判断该用户是否已经存在! { ps.println("请输入密码!"); pass = br.readLine(); break; } else { if(k>3) { break; } ps.println("该用户名不存在,请重新输入用户名"); name = br.readLine(); ps.flush(); } } k=0; while (true) { if (!alluser.getProperty(name).equalsIgnoreCase(pass) && k < 3) { ps.println("密码错误请重新输入"); k++; ps.flush(); br.readLine(); } else if (!alluser.getProperty(name).equalsIgnoreCase(pass) && k >= 3) { ps.println("输入错误次数超过3次"); doQuit(); break; } else if (alluser.getProperty(name).equalsIgnoreCase(pass)) { chek = true;//sendQuestion(); break; } } } catch (IOException e) { e.printStackTrace(); } return chek; } }