玩具kv数据库

举报
兔老大 发表于 2021/04/19 23:39:19 2021/04/19
【摘要】 介绍 用java写一个简陋的kv数据库(俩小时的货),用来复习一下java流知识、线程、socket等知识。 客户端: 很简单的写了一下 功能:就是发送用户的命令,还有接收数据显示出来服务端: redis类:读写和操作数据库(就是封装了一堆map) socket类:接收命令,发送数据打开这两个,然后在客户端打命令即可。 使用规范:*********************...

介绍

用java写一个简陋的kv数据库(俩小时的货),用来复习一下java流知识、线程、socket等知识。


  
  1. 客户端:
  2. 很简单的写了一下
  3. 功能:就是发送用户的命令,还有接收数据显示出来
  4. 服务端:
  5. redis类:读写和操作数据库(就是封装了一堆map)
  6. socket类:接收命令,发送数据
  7. 打开这两个,然后在客户端打命令即可。
  8. 使用规范:
  9. ***************************************
  10. create tableName//创建表(最多一百个,可以改)
  11. 例:create stu//创建名为stu的表
  12. ***************************************
  13. use tableName//操作表
  14. 例:use stu//操作名字为stu的表
  15. ***************************************
  16. showall//打印所有表名
  17. ***************************************
  18. 增:add key value
  19. 删:delete key
  20. 改:change key
  21. 查:get key
  22. 是否存在:contains key
  23. ***************************************
  24. end//结束

redis.java:

大概思路:

属性:

    private Map<String, String>[] r // 存储所有表
    private String[] tableName//存储所有表名
    private int num = 0;// 表数量
    private int target;// 当前操作的表

方法:

    增删改查

    更换操作的表

    打印

    写入硬盘

    从硬盘读出数据

    接受命令并执行,给反馈


  
  1. package redisDemo01;
  2. import java.io.*;
  3. import java.util.*;
  4. public class redis {
  5. Scanner in = new Scanner(System.in);
  6. private Map<String, String>[] r = new Map[100];// 最多创建100个表
  7. private String[] tableName = new String[100];
  8. private int num = 0;// 表数量
  9. private int target;// 当前操作的表
  10. // 创建表
  11. public void create(String name) {
  12. r[num] = new HashMap<String, String>();
  13. tableName[num] = name;
  14. target = num;
  15. num++;
  16. }
  17. // 操作表
  18. public void use(int target) {
  19. this.target = target;
  20. }
  21. public void use(String name) {
  22. for (int i = 0; i < num; i++) {
  23. if (tableName[i].equals(name)) {
  24. target = i;
  25. break;
  26. }
  27. }
  28. }
  29. // 判断是否存在
  30. public boolean contains(String key) {
  31. return r[target].containsKey(key);
  32. }
  33. // 增
  34. public void add(String key, String value) {
  35. r[target].put(key, value);
  36. }
  37. // 删
  38. public void delete(String key) {
  39. r[target].remove(key);
  40. }
  41. // 改
  42. public void change(String key, String value) {
  43. r[target].put(key, value);
  44. }
  45. // 查
  46. public String get(String key) {
  47. return r[target].get(key);
  48. }
  49. // 打印表
  50. public String show() {
  51. String ans = "";
  52. for (String key : r[target].keySet()) {
  53. ans = ans + key + " " + r[target].get(key) + " ";
  54. }
  55. return ans;
  56. }
  57. public String showAllTableName() {
  58. String anString="";
  59. for(int i=0;i<num;i++)
  60. anString=anString+i+":"+tableName[i];
  61. return anString;
  62. }
  63. //写入硬盘
  64. public void write() {
  65. try {
  66. Writer writer = new FileWriter(new File("member.txt"));
  67. int i=0;//表的下标
  68. while (i<num) {
  69. writer.write("table " + tableName[i] + "\r\n");//表名
  70. for (String key : r[i].keySet()) {
  71. writer.write(key + " " + r[i].get(key) + "\r\n");//数据
  72. }
  73. i++;
  74. }
  75. writer.close();
  76. } catch (IOException e) {
  77. e.printStackTrace();
  78. }
  79. }
  80. //读数据
  81. public void read() {
  82. try {
  83. FileReader fileReader = new FileReader("member.txt");
  84. BufferedReader bufferedReader = new BufferedReader(fileReader);
  85. String str;
  86. while ((str = bufferedReader.readLine()) != null) {
  87. String[] a = str.split(" ");
  88. if (a[0].equals("table")) {
  89. create(a[1]);//新表
  90. } else {
  91. add(a[0], a[1]);//表里的数据
  92. }
  93. }
  94. bufferedReader.close();
  95. fileReader.close();
  96. } catch (IOException e) {
  97. e.printStackTrace();
  98. }
  99. }
  100. // 接收命令
  101. public String command(String aString) {
  102. String ans = "success";
  103. String[] cmd = aString.split(" ");
  104. for (int i = 0; i < cmd.length; i++) {
  105. cmd[i] = cmd[i].replaceAll(" ", "");
  106. }
  107. String command = cmd[0];
  108. if (command.equals("create")) {
  109. create(cmd[1]);
  110. } else if (command.equals("use")) {
  111. use(cmd[1]);
  112. } else if (command.equals("add")) {
  113. add(cmd[1], cmd[2]);
  114. } else if (command.equals("contains")) {
  115. if (contains(cmd[1]))
  116. ans = "This key exists";
  117. else
  118. ans = "This key does not exists";
  119. } else if (command.equals("get")) {
  120. ans = "key:" + cmd[1] + " value:" + get(cmd[1]);
  121. } else if (command.equals("delete")) {
  122. delete(cmd[1]);
  123. } else if (command.equals("show")) {
  124. ans = show();
  125. } else if (command.equals("showall")) {
  126. ans = showAllTableName();
  127. } else if (command.equals("end")) {
  128. write();
  129. return "end";
  130. }else {
  131. return "false,tryAgain";
  132. }
  133. return ans;
  134. }
  135. }

socket.java

属性:

    String cmd;// 命令
    redis r0 // 数据库
    String returnText // 给客户看的信息

方法:

    主要任务是和客户端通信,接受命令,发出客户看到的界面数据。


  
  1. package redisDemo01;
  2. import java.io.*;
  3. import java.net.*;
  4. public class socket implements Runnable {
  5. String cmd;// 命令
  6. redis r0 = new redis();// 数据库
  7. String returnText = "success";// 给客户看的信息
  8. public void run() {
  9. try {
  10. r0.read();
  11. ServerSocket serverSocket = new ServerSocket(12016);
  12. do {
  13. Socket socket = serverSocket.accept();
  14. InputStream is = socket.getInputStream();
  15. OutputStream os = socket.getOutputStream();
  16. byte[] cache = new byte[1024];
  17. is.read(cache);
  18. cmd = new String(cache);
  19. cmd = cmd.trim();// 去掉多余空格,这个bug调了半天
  20. System.out.println("redis > " + cmd);
  21. returnText = r0.command(cmd);//操作数据库
  22. os.write(returnText.getBytes());// 给客户打印的数据
  23. os.flush();
  24. is.close();
  25. os.close();
  26. } while (!returnText.equals("end"));
  27. // serverSocket.close();
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }

然后你run一下socket,服务端这边就完事了。

ClientThread.java

接受客户命令然后发给服务端

接受服务端处理完的数据

用自己的方式呈现给客户(惭愧惭愧)


  
  1. package Demo;
  2. import java.io.*;
  3. import java.net.*;
  4. import java.util.*;
  5. public class ClientThread implements Runnable {
  6. @Override
  7. public void run() {
  8. try {
  9. while (true) {
  10. Scanner s = new Scanner(System.in);
  11. String temp = s.nextLine();
  12. Socket socket = new Socket("127.0.0.1", 12016);
  13. // 获取输入输出流
  14. InputStream is = socket.getInputStream();
  15. OutputStream os = socket.getOutputStream();
  16. // 发送
  17. os.write(temp.getBytes());
  18. os.flush();
  19. // 接收
  20. byte[] cache = new byte[1024];
  21. is.read(cache);
  22. String a = new String(cache);
  23. if (temp.equals("show")) {//打印所有k——v
  24. a = a.trim();//去空格
  25. String[] c = a.split(" ");
  26. for (int i = 0; i < c.length; i++) {
  27. c[i] = c[i].replaceAll(" ", "");
  28. }
  29. for (int i = 0; i < c.length - 1; i += 2)//依次打印k——v
  30. System.out.printf("key:%10s value:%10s\n", c[i], c[i + 1]);
  31. } else
  32. System.out.println(a);
  33. os.close();
  34. socket.close();
  35. if (temp.equals("end"))
  36. break;
  37. }
  38. } catch (Exception e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }

界面贼丑但是就是随便练个手啦。。。

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/92385004

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。