关于Socket
概念:Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换。
流程图如下:
代码实现:
服务端
package cn.enjoy.socket;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(8888);
//代码阻塞(等待客户端连接)
Socket socket = serverSocket.accept();
//把消息读到byte数组里面
InputStream reader = socket.getInputStream();
byte[] request = new byte[1024];
reader.read(request);
//转化成string 输出
String req = new String(request);
System.out.println(req);
serverSocket.close();
}
}
客户端:
package cn.enjoy.socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception{
//连接上Server
Socket socket = new Socket("127.0.0.1", 8888);
//获得输出流
OutputStream writer = socket.getOutputStream();
//发送信息给服务端
writer.write("hello I'm deer".getBytes());
socket.close();
}
}
Resp概述
基于TCP的应用层协议 RESP (REdis Serialization Protocol)
RESP底层采用的是TCP的连接方式,通过tcp进行数据传输,然后根据解析规则解析相应信息,完成交互。
特点
- 容易实现
- 解析快
- 可读
Resp解读
Resp官网介绍:https://redis.io/topics/protocol
Resp格式:
1、数组类型 Arrays,以星号开头 格式:* 数组元素个数 \r\n
2、大字符串类型 Bulk Strings, 以"$"美元符号开头 格式:美元符号+字符串的长度 \r\n
字符串 \r\n
基于Resp实现手写Jedis
package com.zyc.resp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class EnjoyRedisClient {
Socket socket;
InputStream reader;
OutputStream writer;
//初始化
public EnjoyRedisClient() throws IOException {
socket=new Socket("127.0.0.1",6379);
reader=socket.getInputStream();
writer=socket.getOutputStream();
}
//set方法实现
public String set(String k, String v) throws Exception {
StringBuffer command = new StringBuffer();
command.append("*3").append("\r\n");
command.append("$3").append("\r\n");
command.append("SET").append("\r\n");
command.append("$").append(k.getBytes().length).append("\r\n");
command.append(k).append("\r\n");
command.append("$").append(v.getBytes().length).append("\r\n");
command.append(v).append("\r\n");
writer.write(command.toString().getBytes());
byte[] reponse = new byte[1024];
reader.read(reponse);
return new String(reponse);
}
//get方法实现
public String get(String k) throws Exception {
StringBuffer command = new StringBuffer();
command.append("*2").append("\r\n");
command.append("$3").append("\r\n");
command.append("GET").append("\r\n");
command.append("$").append(k.getBytes().length).append("\r\n");
command.append(k).append("\r\n");
writer.write(command.toString().getBytes());
byte[] reponse = new byte[1024];
reader.read(reponse);
return new String(reponse);
}
}