手写Tomcat核心组件之Request

1.Tomcat客户端交互流程

在这里插入图片描述
通过socket读取请求信息,和响应正文
在这里插入图片描述

2.演示启动Tomcat(服务端)的过程

java -jar Request-02.java
在这里插入图片描述
服务端处于等待状态

3.客户端Chrom向服务器发起HTTP请求

url:localhost:8088/index.htmlhttp://localhost:8088/index.html?id=1&name=2&age=3

这时客户端已经连接到自己写的服务器端
在这里插入图片描述

// 请求行相关信息定义
	// GET 请求方式
	// /index.html?id=1&name=2&age=3 请求资源的抽象路径和参数
	// HTTP/1.1 请求使用HTTP协议版本
GET /index.html?id=1&name=2&age=3 HTTP/1.1

// 消息头相关信息定义
// 消息头都是k y结构的?用什么数据结构存储?
Host: localhost:8088
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Idea-1fb5ea2b=2c298e30-2594-4f15-bb77-b7485b32cd2a; Idea-68aa3953=69a2d03c-b703-4b59-b36e-ad13190cd672; Idea-68aa3d12=98d67fee-0864-455c-866e-48d49729208e; pdstore_ticket=1a3f7340-ed4c-4fd0-a041-f0c2e8e5878e

// 消息正文相关信息定义
.......................

socker.getInputStream()获得的输入流,读取请求相关信息,从浏览器客户端读到Tomcat服务器中的

4.进一步解析request中的url(请求)

在这里插入图片描述

HttpRequest:解析请求行
请求行:GET /index.html?id=1&name=2&age=3 HTTP/1.1
HttpRequest:进一步解析url
requestURI:/index.html
queryString:id=1&name=2&age=3
paramaters:{name=2, id=1, age=3}
HttpRequest:解析url部分完毕
method:GET
url:/index.html?id=1&name=2&age=3
protocol:HTTP/1.1
HttpRequest:请求行解析完毕
HttpRequest:解析消息头
headers:{Cookie=Idea-1fb5ea2b=2c298e30-2594-4f15-bb77-b7485b32cd2a; Idea-68aa3953=69a2d03c-b703-4b59-b36e-ad13190cd672; Idea-68aa3d12=98d67fee-0864-455c-866e-48d49729208e; pdstore_ticket=1a3f7340-ed4c-4fd0-a041-f0c2e8e5878e, Accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9, Connection=keep-alive, User-Agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36, Sec-Fetch-Site=none, Sec-Fetch-Dest=document, Host=localhost:8088, Accept-Encoding=gzip, deflate, br, Sec-Fetch-Mode=navigate, sec-ch-ua=" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90", sec-ch-ua-mobile=?0, Cache-Control=max-age=0, Upgrade-Insecure-Requests=1, Sec-Fetch-User=?1, Accept-Language=zh-CN,zh;q=0.9}
HttpRequest:消息头解析完毕

get请求传人的参数就会解析成Map结构,存放到Map里

5.模拟Tomcat的包结构

Request
|----core
	|--ClientHandler
	|--WebServer
|----http
	|--HttpRequest

6.Tomcat的执行流程

在这里插入图片描述

7.Tomcat响应客户端(response)

如果Tomcat不做出响应,Chrom浏览器就会一直没有页面如图
在这里插入图片描述

7.5 简易实现response,用resposne回复客户端

1.用socket获取输出流,从Java程序(服务端Tomcat)写到客户端socket.getOutputStream()
2.回复客户端的规范

HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Content-Length: "响应正文".length
“响应正文"

给客户端发送的代码

OutputStream outputStream = socket.getOutputStream();
// 发送状态行
outputStream.write("HTTP/1.1 200 OK".getBytes(StandardCharsets.UTF_8));
outputStream.write(13);
outputStream.write(10);

// 发送响应头
outputStream.write("Content-Type: text/html;charset=utf-8".getBytes(StandardCharsets.UTF_8));
outputStream.write(13);
outputStream.write(10);

// 发送响应正文
outputStream.write(("Content-Length: "+"祝大家前程似锦,天黑有灯下雨有伞~".getBytes(StandardCharsets.UTF_8).length).getBytes(StandardCharsets.UTF_8));
outputStream.write(13);
outputStream.write(10);
outputStream.write(13);
outputStream.write(10);

outputStream.write("祝大家前程似锦,天黑有灯下雨有伞~".getBytes(StandardCharsets.UTF_8));
outputStream.flush();

3.10是换行13是回车键

在这里插入图片描述

这时就实现了Tomcat整个请求request和响应resposne的过程

谢谢大家! 祝大家前程似锦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值