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 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【Java】手写SpringBoot-超详细(全过程注解)[更新中] -> 正文阅读

[Java知识库]【Java】手写SpringBoot-超详细(全过程注解)[更新中]


🎈前言🎈

?作者:Leo?
?欢迎点赞👍收藏🌟留言、评论、私信必回哦?
?文章中涉及到的代码均已上传至GitHub?
?全文字数2567字,阅读时长10~20mins?

Verison1

项目目标:实现Tomcat的WebServer的核心功能
????????????????? 将客户端发来的请求进行接收

项目代码

客户端(ClientHandler)

知识点:

  1. 调用Runnable接口重写run()方法,在线程启动后
    执行run()方法中代码
  2. 利用Socket实现服务端客户端通信
  3. InputStream字节输入流,获取服务端接收的数据
  4. read()方法在读取完所有数据后返回-1表示读取完成
public class ClientHandler implements Runnable {
    private Socket socket;

    public ClientHandler(Socket socket) throws IOException {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream in = socket.getInputStream();
            int d;
            while ((d = in.read()) != -1) {
                System.out.print((char) d);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

服务器(Server)

public class BirdBootApplication {
    private ServerSocket serverSocket;
    public BirdBootApplication() {
        try {
            System.out.println("正在启动服务端...");
            serverSocket = new ServerSocket(8088);
            System.out.println("服务端启动完毕!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void start() {

        try {
            System.out.println("等待客户端连接...");
            Socket socket = serverSocket.accept();
            System.out.println("一个客户端连接了!");
            //启动一个线程处理该客户端交互
            ClientHandler handler = new ClientHandler(socket);
            Thread t = new Thread(handler);
            t.start();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        BirdBootApplication application = new BirdBootApplication();
        application.start();
    }
}

运行效果

客户端启动前
运行前效果
在浏览器中输入localhost:8088/index.html后(启动客户端)
运行后效果

Question:在客户端中若使用while(true)死循环读取请求数据会导致什么
Answer:在读取完请求头信息后线程没有关闭,导致死循环read()方法一直返回-1,需手动终止程序

Version2

项目目标:将请求数据(请求方式Method,抽象路径URI,协议版本Protocal)进行拆分并存入数组

项目代码

客户端(ClientHandler)

知识点

  1. 由Version1得知我们要获取的数据是GET /index.html HTTP/1.1,由此可采用寻找CRLF(回车换行符)来终止循环
  2. StringBuilder拼接InputStream中读取到的字符
  3. 将StringBuilder中的数据使用toString()方法转换为字符串,利用split方法进行剪切并存入数组
public class ClientHandler implements Runnable{
    private Socket socket;
    public ClientHandler(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream in = socket.getInputStream();
            StringBuilder builder = new StringBuilder();
            char pre='a',cur='a';//pre表示上次读取的字符,cur表示本次读取的字符
            int d;
            while((d = in.read())!=-1){
                cur = (char)d;//本次读取到的字符
                if(pre==13&&cur==10){//若上次读取的是回车符并且本次读取的是换行符
                    break;
                }
                builder.append(cur);//拼接本次读取到的字符
                pre = cur;//进入下次循环前将本次读取的字符记作上次读取的字符
            }
            String line = builder.toString().trim();
            System.out.println("请求行内容:"+line);
            //请求的相关信息
            String method;//请求方式
            String uri;//抽象路径
            String protocol;//协议版本

            String[] data = line.split("\\s");
            method = data[0];
            uri = data[1];
            protocol = data[2];
            System.out.println("method:"+method);
            System.out.println("uri:"+uri);
            System.out.println("protocol:"+protocol);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //按照HTTP协议要求,处理最后要断开连接
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行效果

V2运行效果

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 10:59:34  更:2022-09-13 11:02:48 
 
开发: 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/23 13:17:37-

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