【学习笔记】手写Tomcat 一

目录

HTTP协议请求格式

HTTP协议响应格式

Socket

解读代码

服务端优化

解读代码

作业

[1. 响应一个 HTML 页面给客户端,游览器把接收到的内容进行渲染](#1. 响应一个 HTML 页面给客户端,游览器把接收到的内容进行渲染)

[2. 文件的媒体类型是写死的,肯定不行,怎么变成动态?](#2. 文件的媒体类型是写死的,肯定不行,怎么变成动态?)

昨天作业答案

聊天室


HTTP协议请求格式

HTTP协议响应格式

Socket

使用游览器作为客户端

创建一个服务端,当游览器访问时响应 hello

服务端

java 复制代码
package com.shao.net;

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

public class Server {
    public static void main(String[] args) throws IOException {
        // 创建一个ServerSocket对象,监听8080端口,等待客户端连接
        ServerSocket ss = new ServerSocket(8080);

        // 调用accept()方法阻塞等待,直到有客户端连接到服务器,返回一个Socket对象用于与该客户端通信
        Socket socket = ss.accept();

        System.out.println("客户端连接成功");

        // 获取Socket对象的输入流,用于读取客户端发送的数据
        InputStream is = socket.getInputStream();

        // 获取Socket对象的输出流,用于向客户端发送数据
        OutputStream os = socket.getOutputStream();

        // 响应的内容
        String content = "Hello";

        // HTTP 响应的格式
        os.write(("HTTP/1.1 200 OK\r\n").getBytes());
        os.write(("Content-Type: text/html\r\n").getBytes());
        os.write(("Content-Length: " + content.length() + "\r\n").getBytes());
        os.write("\r\n".getBytes());
        os.write(content.getBytes());
        os.flush();
        System.out.println("响应成功");
    }
}

游览器访问服务端

访问本地 IP 加服务端监听的端口

解读代码

因为游览器和服务端是使用 HTTP 协议通信,所以响应的格式是HTTP响应格式

HTTP 请求格式分为三个部分,分别是 请求行、请求头、请求体(数据)

HTTP 响应格式分为三个部分,分别是 响应行、响应头、响应数据

响应行包括 响应协议、状态码、状态码描述

响应头包括 响应数据的类型(媒体类型)、响应数据的长度等

服务端优化

现在的问题,只能访问一次服务端,服务端响应之后就关闭了。这显然不是我们想要的,服务器是当用户访问的时候都会响应数据

那么如何才能让服务端响应数据之后继续运行呢?

解决方案是加个 while 循环

java 复制代码
package com.shao.net;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {

        // 创建一个ServerSocket对象,监听8080端口,等待客户端连接
        ServerSocket ss = new ServerSocket(8080);

        while (true) {

            // 调用accept()方法阻塞等待,直到有客户端连接到服务器,返回一个Socket对象用于与该客户端通信
            Socket socket = ss.accept();

            System.out.println("客户端连接成功");

            // 获取Socket对象的输入流,用于读取客户端发送的数据
            InputStream is = socket.getInputStream();

            // 获取Socket对象的输出流,用于向客户端发送数据
            OutputStream os = socket.getOutputStream();

            // 响应的内容
            String content = "Hello";

            // HTTP 响应的格式
            os.write(("HTTP/1.1 200 OK\r\n").getBytes());

            os.write(("Content-Type: text/html\r\n").getBytes());
            os.write(("Content-Length: " + content.length() + "\r\n").getBytes());
            os.write("\r\n".getBytes());

            os.write(content.getBytes());

            os.flush();
            System.out.println("响应成功");

            // 关闭输出流
            os.close();
        }
    }
}

验证

解读代码

  1. 为什么不把 ServerSocket ss = new ServerSocket(8080); 这行代码也加到 循环语句呢?

因为这行代码是创建服务端的Socket,只需要创建一次即可

  1. 为什么从 Socket socket = ss.accept(); 这行代码开始循环呢?

这行代码是等待客户端连接,建立通信通道。

我们知道,服务端不是只为一个客户端服务的,所以,当新的用户发送连接后,就需要创建一个新的通信通道

作业

1. 响应一个 HTML 页面给客户端,游览器把接收到的内容进行渲染

创建一个HTML 页面,创建一个方法,使用IO流获取这个HTML 文件的内容,把数据响应给游览器,注意响应的长度 Content-Length 需要和文件的字节数一致

2. 文件的媒体类型是写死的,肯定不行,怎么变成动态?

方案一:通过判断文件后缀

方案二:通过jdk自带的类去获取文件的媒体类型

方案三:通过第三方插件jar,读取文件判断文件媒体类型

昨天作业答案

聊天室

代码已放到页面

百度网盘

相关推荐
DevOpenClub2 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
一个人旅程~2 小时前
关于imac27inch因改短用户名导致混合硬盘和系统崩溃的问题分析与故障解决
经验分享·笔记·macos·新浪微博
心祭丫丫2 小时前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
露天赏雪3 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力3 小时前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python
天天被压力3 小时前
【A股分钟级高频数据完全手册 #05】指数历史分钟数据接口:Pro版沪深指数分时回放
java·人工智能·python
captain3763 小时前
▲统一功能——DispatcherServlet源码分析
java·spring·java-ee·log4j·maven
金銀銅鐵3 小时前
JDK 21 中 List.of 的实现细节:从 List12 到 ListN
java·后端·ai编程
派大猩猩_4 小时前
Obsidian 笔记怎么同步多端:Nutstore Sync 大笔记库同步测评
笔记·obsidian·obsidian插件·obsidian同步
yeccheng5 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试