Java-IDEA模拟一个Redis服务器,与Redis客户端进行一次简单的交互。默认端口号:6379

首先要了解Redis的交互协议。

摘抄:

  1. 简单字符串(Simple Strings): 以 “+” 开头,例如 “+OK\r\n” 表示一个成功的响应。
  2. 错误(Errors): 以 “-” 开头,例如 “-ERR unknown command\r\n” 表示一个错误响应。
  3. 整数(Integers): 以 “:” 开头,例如 “:1000\r\n” 表示整数1000。
  4. 批量字符串(Bulk Strings): 以 “$” 开头,例如 “$6\r\nfoobar\r\n” 表示一个长度为6的字符串 “foobar”。
  5. 数组(Arrays): 以 “*” 开头,例如 “*3\r\n:1\r\n:2\r\n:3\r\n” 表示包含3个整数的数组 [1, 2, 3]。

 最好设置Redis是无密码允许访问。

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

/**
 * @ Annotation:模拟Redis服务器 port=6379
 */
public class RedisHost {
    /**
     * 1.客户端连接命令:COMMAND
     * 2.RedisHost response "OK"
     * 3.客户端发送命令
     * 4.RedisHost response "OK"(如果是"set"命令)
     * 5.客户端发送命令
     * 6.RedisHost response "value"(如果是"get")命令
     * @param args
     */
    public static void main(String[] args) {
      try {
            byte[] bytes = new byte[1024];
            ServerSocket server = new ServerSocket();
            InetSocketAddress address = new InetSocketAddress("127.0.0.1", 6379);
            server.bind(address);
            Socket accept = server.accept();
            InputStream is = accept.getInputStream();//客户端带宽
            //客户端连接
            int clientCon = is.read(bytes);
            System.out.println("客户端连接:" + new String(bytes, 0, clientCon));
            OutputStream os = accept.getOutputStream();//Redis服务器带宽
            //Redis回应OK
            String hostRespCon = "+OK\r\n";
            os.write(hostRespCon.getBytes());
            os.flush();
            System.out.println("客户端与Redis服务器连接成功,Redis服务器响应了:" + hostRespCon);
            System.out.println("客户端可以继续输入内容");
            //等待客户端输入。。。。
            //读取客户端的第一次输入
            int clientSet = is.read(bytes);
            String clientStr = new String(bytes, 0, clientSet);
            System.out.println("客户端第一次输入了:" + clientStr);
            //Redis对客户端的输入响应+OK
            String hostRespSet = "+OK\r\n";
            os.write(hostRespSet.getBytes());
            os.flush();
            System.out.println("客户端输入成功,Redis服务器响应了:" + hostRespSet);
            //客户端再次输入
            System.out.println("客户端可以继续输入内容");
            int clientGet = is.read(bytes);
            String clientGetStr = new String(bytes, 0, clientGet);
            System.out.println("客户端又输入了:" + clientGetStr);
            //组装语句
            String substring = getLastStr(clientStr);//值
            //Redis响应
            if (clientGetStr.contains("get")) {
                if (getLastStr(clientGetStr).equals(getKey(clientStr))){
                    os.write(substring.getBytes());
                    System.out.println("服务器响应了:" + substring);
                }else {
                    String notExist="*-1\r\n$3\r\nnull\r\n";
                    os.write(notExist.getBytes());
                    System.out.println("客户端输入的键:"+getLastStr(clientGetStr)+"不存在!");
                }
            }
            //释放资源
            os.flush();
            is.close();
            os.close();
            accept.close();
            server.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //从后面开始截取:从最后一个字符"input"开始,截到最后。
    public static String getLastStr(String input) {
        return input.substring(input.lastIndexOf("$"));
    }
    public static String getKey(String s){
        return s.substring(s.indexOf(s.substring(s.indexOf("$",6))),s.lastIndexOf("$"));
    }
}

添加一个,模拟客户端: 

直接上代码: 

 

import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

/**
 * @ Annotation:模拟客户端
 */
public class Client {
    public static void main(String[] args) {
        //客户端只做三件事
        redisClient();//1.连接 2."set name lili" 3."get name"
    }
    public static void redisClient(){
        try {
            Socket client = new Socket();
            InetSocketAddress address = new InetSocketAddress("127.0.0.1", 6379);
            client.connect(address);//连接Redis
            OutputStream os = client.getOutputStream();
            os.write("*1\r\n$7\r\nCOMMAND\r\n".getBytes());
            os.flush();
            InputStream is = client.getInputStream();
            byte[] bytes = new byte[1024];
            int firstCon = is.read(bytes);
            System.out.println("Redis响应:"+new String(bytes, 0, firstCon));
            os.write("*3\r\n$3\r\nset\r\n$4\r\nname\r\n$4\r\nlili\r\n".getBytes());//"set name lili"
            System.out.println("你发送了:set name lili");
            os.flush();
            int read = is.read(bytes);
            System.out.println("Redis响应:"+new String(bytes,0,read));
            os.write("*2\r\n$3\r\nget\r\n$4\r\nname\r\n".getBytes());//"get name"
            System.out.println("你发送了:get name");
            //os.write("*2\r\n$3\r\nget\r\n$5\r\nother\r\n".getBytes());//"get other"
            int respGet = is.read(bytes);
            System.out.println("Redis响应:"+new String(bytes,0,respGet));
            System.out.println("Done......");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

测的时候,Redis服务端先开启,然后再开启客户端Client:

如果此文对你有帮助,请一键三连,点赞收藏加关注!作者后续会更新更多高质量文章哦!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值