首先要了解Redis的交互协议。
摘抄:
- 简单字符串(Simple Strings): 以 “+” 开头,例如 “+OK\r\n” 表示一个成功的响应。
- 错误(Errors): 以 “-” 开头,例如 “-ERR unknown command\r\n” 表示一个错误响应。
- 整数(Integers): 以 “:” 开头,例如 “:1000\r\n” 表示整数1000。
- 批量字符串(Bulk Strings): 以 “$” 开头,例如 “$6\r\nfoobar\r\n” 表示一个长度为6的字符串 “foobar”。
- 数组(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:
如果此文对你有帮助,请一键三连,点赞收藏加关注!作者后续会更新更多高质量文章哦!谢谢!