知识问答服务器
功能需求:
1. 实现用户登陆验证(按照用户权限进行划分,主要分为管理员和普通访问者两种权限)
2. 实现普通用户的注册(需要输入用户名和密码)
3. 实现知识问答题库的录入(权限为管理员)
4. 实现知识问答题目的随机选题(从题库中随机选出10题)
5. 普通用户成功登陆后,服务器将发送题目给用户,每回只发一题,用户答完后,服务器立即验证用户的答案是否正确,并将结果发给用户,然后发送下一题的题目。
6. 用户完成所有的题目后服务器将会把用户的最终的得分以及答题的正确率发给用户。
7. 实现服务器日志用于保存用户访问的时间,离开的时间和用户的答题结果。(服务器日志文件由3个文件组成,每个文件有固定大小1M,写满后自动切换写入下一个文件,同时将写满的文件进行归档保存,即保存到压缩文件)
8. 知识问答服务器能够实现多人同时访问。
9. 以上所述的文件均为属性文件(包括题库,用户验证)
10. 日志文件为*.log文件
项目时间:3个工作日
知识考察点:
IO流,多线程,socket通讯,Properties,Map,Set,List,HashMap,HashSet,ArrayList,数组,staitc初始化块 ,final修饰符,Date类,File类,递归,getset器,构造器,方法的重载与覆盖.
启动服务器类:
/**
* 知识问答服务器
*/
public class KnowledgeServer {
private boolean started;
public KnowledgeServer(){
try {
ServerSocket ss = new ServerSocket(5000);
System.out.println("WEPULL知识问答服务器启动!");
started = true;
while(started){
Socket s = ss.accept();
System.out.println(s.getInetAddress()+"用户连接上来!");
new KnowledgeSession(s).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new KnowledgeServer();
}
}
核心类:
public class KnowledgeSession extends Thread {
private static Properties users = new Properties(); //用户属性文件
private static Properties quizs = new Properties(); //题目属性文件
private static Properties admins = new Properties(); //管理员属性文件
//静态初始化块,系统一启动就把这三个属性文件加载到内存中
static{
try {
InputStream is = new FileInputStream("users.properties");
users.load(is);
is.close();
is = new FileInputStream("quizs.properties");
quizs.load(is);
is.close();
is = new FileInputStream("admin.properties");
admins.load(is);
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private Socket s;
private BufferedReader br;
private PrintStream ps;
private String inTime; //用户登录时间
private String outTime; //用户退出时间
private String result; //用户得分结果
private String username; //用户名名
public KnowledgeSession(Socket s) {
this.s = s;
try {
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
ps = new PrintStream(s.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//log
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日hh时mm分ss秒");
inTime = sdf.format(now); //获得用户登录时间
ps.println(s.getRemoteSocketAddress()+",欢迎您来到知识问答服务器,这是锻炼您头脑的天堂!");
sendMainUI();
}
/**
* 给客户端发送 选择服务 主界面
*/
private void sendMainUI() {
ps.println("********************************");
ps.println("请您选择服务种类:");
ps.println("1.普通用户注册");
ps.println("2.普通用户登录");
ps.println("3.管理员登录");
ps.println("4.退出系统");
ps.println("********************************");
String command = null;
try {
command = br.readLine();
if("1".equalsIgnoreCase(command))
doRegister(); // 1 代表用户注册,调用注册方法
else if("2".equalsIgnoreCase(command))
doLogin(); // 2 代表用户登录,调用登录方法
else if("3".equalsIgnoreCase(command))
doAdminLogin(); // 3 代表管理员登录,调用管理员登录方法
else if("4".equalsIgnoreCase(command)){
ps.println("正在退出·····");
doQuit(); // 4 代表退出系统,调用退出方法
}else{
ps.println("输入有误!请输入对应菜单前面数字!");
sendMainUI();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 退出方法
*/
private void doQuit() {
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日hh时mm分ss秒");
outTime = sdf.format(now);
//将用户登录离开信息写入日志中
MyLogger.output("用户【"+username+"】于"+inTime+
"进入系统,答题分数为:【"+result+"】,于"+outTime+"离开系统!");
if(s!=null&&!s.isClosed()){
try {
ps.println("再见,欢迎下次光临!");
br.close();
ps.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 管理员登录方法,登录成功则录入题目
*/
private void doAdminLogin() {
ps.println("请您输入管理员登陆用户名:");
try {
username = br.readLine();
ps.println("请您输入管理员登陆密码:");
String password = br.readLine();
String realPass = admins.getProperty(username);
if(password.equals(realPass)){
ps.println("恭喜您,管理员成功登录!");
ps.println("******************************");
ps.println("请您仔细录入题库!");
ps.println("******************************");
ps.println();
do{
ps.println("请输入题目:");
String q = br.readLine();
ps.println("请输入答案:");
String a = br.readLine();
OutputStream os = new FileOutputStream("quizs.properties");
quizs.setProperty(q, a);
quizs.store(os, null);
os.close();
ps.println("您还要继续录入吗?[y/n]");
}while("y".equalsIgnoreCase(br.readLine()));
}else{
ps.println("对不起,用户名或密码错误!");
}
ps.println();
sendMainUI(); //重新发送主界面
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 用户登录方法,登录成功即可答题
*/
private void doLogin() {
ps.println("请您输入登陆用户名:");
try {
username = br.readLine();
ps.println("请您输入登陆用户密码:");
String password = br.readLine();
String realPass = users.getProperty(username);
if(password.equals(realPass)){
ps.print("恭喜您,登陆成功,系统马上转入答题环节,请稍候");
for (int i = 0; i < 6; i++) {
ps.print(".");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
ps.println();
sendQuizs();
}else{
ps.println("对不起,用户名或密码错误!");
ps.println();
sendMainUI(); //重新发送主界面
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @throws IOException
* 随机出题方法
*/
private void sendQuizs() throws IOException {
/********随机出题实现*****************/
Object[] objs = quizs.keySet().toArray();
Random ran = new Random();
Set<String> set = new HashSet<String>();
while(set.size()<5) {
int index = ran.nextInt(objs.length); //随机出现指定范围内的一个整数
set.add((String) objs[index]);
}
ps.println("***************************");
ps.println("请认真做好答题准备,遵守考场纪律!");
ps.println("***************************");
int count = 0; //题数
int right = 0; //答题正确数
Iterator<String> it = set.iterator();
while(it.hasNext()){
String key = it.next();
count++;
ps.println("【☆☆返回主菜单请输入QUIT☆☆】 第【"+count+"】题:"+key);
String answer = br.readLine();
if("quit".equalsIgnoreCase(answer)){
break;
}
String rightAnswer = quizs.getProperty(key);
if(answer.equalsIgnoreCase(rightAnswer)){
right++;
ps.println("恭喜您,回答正确!");
}else{
ps.println("对不起,回答错误,正确答案是:【"+rightAnswer+"】!");
}
ps.println();
}
result = right*100/count+"分";
ps.println("答题完毕!本次答题总共【"+count+"】道,您答对【"+right+"】道,正确率为:【"+right*100/count+"%】,得分为【"+right*100/count+"】分!");
sendMainUI();
}
/**
* 用户注册方法
*/
private void doRegister() {
try {
ps.println("请您输入注册用户名:");
String username = br.readLine();
if(users.getProperty(username)==null){
ps.println("请您输入注册用户密码:");
String password = br.readLine();
ps.println("请您再次输入确认用户密码:");
String confirmPass = br.readLine();
if(password.equals(confirmPass)){
//注册成功添加到users属性文件中
users.setProperty(username, password);
OutputStream out = new FileOutputStream("users.properties");
users.store(out, null);
out.close();
ps.println("恭喜您,注册成功!");
ps.println();
sendQuizs(); //调用发题目方法
}else {
ps.println("两次输入密码不匹配!");
sendMainUI();
}
}else {
ps.println("该用户名已经存在!请重新输入!");
doRegister();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
这个系统的主要目的是实现课程的KBQA(Knowledge-Based Question Answering)问答系统,以及课程信息的查询,并通过D3.JS进行数据可视化。以下是相关的知识点详解: 1. **Spring-boot框架**:Spring-boot是Spring...
本源码的名称为"ranger-knowledge-pay-master",暗示了这是一个基于Ranger框架的开源项目,专门针对知识付费场景进行了优化。 首先,我们需要了解微信小程序的基本概念。微信小程序是一种轻量级的应用形式,用户...
在本项目"knowledge-graph-etl:meemoo知识图的ETL代码"中,我们将探讨如何构建和维护一个知识图谱,特别是关注其数据提取(Extract)、转换(Transform)和加载(Load,即ETL)过程。 首先,Apache Airflow是一款...
综上所述,"knowledgebase:与知识库的集成"这一话题涵盖了知识管理、JavaScript开发、前端工程、用户体验设计、数据存储和安全等多个方面。了解并熟练运用这些知识点,可以创建出高效、安全且易于使用的知识库插件。
Veaos是一个免费的开源问答和知识管理平台 · 关于该项目 Veaos是一个以MERN堆栈(MongoDB,Express.js,React和Node.js)编写的问答基础知识平台。 该项目的目的是使组织能够为员工建立自己的问答和知识平台,以便...
A Knowledge Graph project about cosmetics. At present, there are 3000 nodes, 150… 软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 ...
5)知识库(Knowledge Base)可以吧常规问题归类起来。 6)报表系统。支持各种报表。 问题面板控制中心 报表中心 Helpdesk帮助台系统 启明星IT Helpdesk页面展示 相关阅读 同类推荐:站长常用源码
DSKMS可能是系统开发者自定义的缩写,代表“Digital Skills Knowledge Management System”或者类似的含义,用于管理知识内容、付费机制、在线培训、教育考试以及视频资源。 【描述】中的内容与标题一致,进一步...
【标题】"FedKGQA" 是一个专注于联邦学习(Federated Learning)领域的知识图谱问答(Knowledge Graph Question Answering, KGQA)系统。在大数据时代,知识图谱已经成为理解和处理复杂信息的重要工具,而联邦学习则...
最后,`knowledge.asp`可能是一个知识问答或常见问题解答页面,提供关于清通服务的专业知识,帮助客户解决问题,增加网站的实用性和专业性。 总体来说,这个“清通公司网站源码”是一个基于ASP.NET技术的简单企业...
【标题】"php SKCMS 网页在线客服免费版php" 涉及的核心知识点是基于PHP开发的SKCMS(Smart Knowledge CMS)网页在线客服系统。这是一个专门为网站提供实时交流功能的开源软件,允许访客与网站管理员或客服人员进行...
这个功能常用于用户交互性较强的Web应用,比如创建一个类似于生词本的应用,允许用户存储和查看知识点。...这种技术广泛应用于在线学习平台、笔记应用、问答系统等,提高了用户体验和数据交互的效率。
- **Knowledge Distillation**:这是一种模型压缩技术,通过训练一个小型模型(如DistilBERT)来复制大型模型(如BERT)的行为,从而在保持性能的同时减小模型大小,适合于生产环境。 - **Transformers**:BERT基于...
"funquiz"是一个基于HTML5开发的在线测验应用程序,主要设计用于进行True or False(对错判断)类型的问答,以提升用户的一般知识(General Knowledge,简称GK)。这个应用利用了JavaScript作为主要的编程语言,实现...
"QuizTOIK" 是一个基于Java开发的在线问答系统或者测试平台。这个项目可能是一个开源的、用于教育或自我评估的工具,用户可以在这里进行各类知识的测验,比如语言学习、编程技能或其他学术领域的测试。从项目名称来...
5. **API集成**:为了提供更丰富的信息,聊天机器人可能集成了一些外部API,如Google Knowledge Graph、Wolfram Alpha或者特定行业的知识库,用于检索额外的数据或进行智能问答。 6. **用户界面**:项目可能包含一...