文章目录
1.Tomcat
与客户端
交互流程
通过socket读取请求信息,和响应正文
2.演示启动Tomcat
(服务端)的过程
java -jar Request-02.java
服务端处于等待状态
3.客户端Chrom
向服务器发起HTTP
请求
url:localhost:8088/index.html
或http://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
的过程
谢谢大家! 祝大家前程似锦