IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 根据ServerSocket实现Http的RPC -> 正文阅读

[网络协议]根据ServerSocket实现Http的RPC

服务端:绑定端口,启动服务监听,请求是啥,响应一些啥?

/**
 * @author x y
 * @description TODO
 * @date 2022-01-18 10:11
 */
public class AcceptServer {
    ServerSocket serverSocket;
    IHandlerFunction iHandlerFunction;

    public AcceptServer(IHandlerFunction iHandlerFunction) {
        this.iHandlerFunction = iHandlerFunction;
    }

    public void listenPort(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        while (true) {
            this.accept();
        }
    }

    public void accept() throws IOException {
        Socket accept = serverSocket.accept();
        new Thread(() -> {
            try {
                this.acceptHandler(accept);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();
    }

    public void acceptHandler(Socket socket) throws IOException {
        Request request = new Request(socket);
        Response response = new Response(socket);
        iHandlerFunction.handler(request,response);
    }

    public static void main(String[] args) throws IOException {
        AcceptServer server = new AcceptServer((req, resp) -> {
            System.err.println(req.getRequestMap());
            resp.send("<html><body><h1>Hello Word!</h1></body></html>");
        });
        server.listenPort(8002);
    }
}

函数式接口:

/**
 * @author x y
 * @description TODO
 * @date 2022-01-18 10:11
 */
@FunctionalInterface
public interface IHandlerFunction {
    void handler(Request request,Response response) throws IOException;
}

请求处理:

/**
 * @author x y
 * @description TODO
 * @date 2022-01-18 10:11
 */
public class Request {
    static Pattern pattern = Pattern.compile("(GET|POST|DELETE|PUT)");
    private final String method;
    private final Map<String, String> requestMap;
    private final String requestBody;

    public String getMethod() {
        return method;
    }

    public Map<String, String> getRequestMap() {
        return requestMap;
    }

    public String getRequestBody() {
        return requestBody;
    }

    public Request(Socket socket) throws IOException {
        // dataInputStream --> char,float数据交互
        // InputStream ---> byte
        DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());

        //请求方式
        String methodPattern = HttpParser.readLine(dataInputStream, "UTF-8");
        Matcher matcher = pattern.matcher(methodPattern);
        matcher.find();
        String method = matcher.group();
        requestMethod(method);
        //请求头
        Header[] headers = HttpParser.parseHeaders(dataInputStream, "utf-8");
        Map<String, String> methodRequestMap = Maps.newHashMap();
        for (Header header : headers) {
            methodRequestMap.put(header.getName(), header.getValue());
        }
        //请求体
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(dataInputStream));
        char[] chars = new char[1024];
        StringBuilder stringBuilder = new StringBuilder();
        if (dataInputStream.available() > 0) {
            bufferedReader.read(chars);
            stringBuilder.append(chars);
        }
        this.method = method;
        this.requestMap = methodRequestMap;
        this.requestBody = stringBuilder.toString();
    }

    public void requestMethod(String method){
        switch (method){
            case "GET":
                System.err.println("get请求方法");
                break;
            case "POST":
                System.err.println("POST请求方法");
                break;
            case "DELETE":
                System.err.println("DELETE请求方法");
                break;
        }
    }
}

响应处理:

/**
 * @author x y
 * @description TODO
 * @date 2022-01-18 10:11
 */
public class Response {
    Socket socket;
    private Integer status = 200;
    private Map<Integer, String> statusMap;

    // 数据转发
    public Response(Socket socket) throws IOException {
        this.socket = socket;
        if (statusMap == null){
            statusMap = Maps.newHashMap();
            statusMap.put(200,"OK");
        }
    }

    public void send(String msg) throws IOException {
        String req = "HTTP/1.1 "+this.status+" "+ this.statusMap.get(this.status)+"\n";
        req +="\n";
        req += msg;
        sendMsg(req);
    }
    public void sendMsg(String msg) throws IOException {
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write(msg);
        bufferedWriter.flush();
        socket.close();
    }
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:35:21  更:2022-03-17 22:35:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:02:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码