实现一个简易的Tomcat
1. 总目标
- 前端和数据库的学习时间为期有一个月左右,很多同学Java内容已经忘光了!
- 后端Java EE内容比较难,所以我们一下子进来可能不太适应,需要过渡一下。
- 希望能够通过过渡课对于客户端和服务端的网络通信有一个比较清晰的了解。
BS和CS架构
2. 了解HTTP协议
2.1 协议的概念
一方或者多方约定好的一个规范。
TCP(传输控制协议)协议
UDP(数据报协议)协议
IP(Internet Protocol 网络协议)协议
2.2 HTTP协议的介绍
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。
它是基于TCP(面向连接的可靠地传输协议(三次握手 四次挥手))协议传输数据。
2.3 HTTP协议的优势
- 支持客户/服务器模式。 (B/S 和 C/S架构)
- **简单快速:**客户向服务器请求服务时,
只需传送请求方法和路径
。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。
由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 - **灵活:**HTTP允许传输
任意类型
的数据对象。正在传输的类型由Content-Type加以标记。 - **无连接:**无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- **无状态:**HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
导致它成为了我们万维网世界的基础传输协议。当然除了HTTP协议之外还有其他的:FTP协议、SSH协议、SMTP协议…
2.4 HTTP协议的(报文)规范
请求规范:
请求行: 用来标注请求资源地址的
请求方式 资源地址URL 协议版本 回车符\r和换行符\n
请求头: 用来标注请求携带的一些特殊要求以及客户端一些标识
键值对存储的信息
请求体: 用来传输参数数据的,GET请求没有请求体
例如:
GET http://www.baidu.com HTTP/1.1必须换行
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br必须换行
必须有一个空行
[username=xx&password=xxx]
响应规范:
响应行:
协议版本 响应编码(状态码) 响应提示
响应头:
键值对
响应体:
响应的数据,什么格式都可以
例如:
HTTP/1.1 200 ok必须有换行
Date: Thu, 27 Jun 2019 01:06:45 GMT必须有换行
Server: Apache必须有换行
Content-Type: text/html;charset=UTF-8必须有换行
必须要有空行
响应数据
HTTP协议的状态码分类:
- 1xx:服务器已经接收到请求,需要等待下一步处理
- 2xx:客户端请求成功,服务器接收且处理成功
- 3xx:重定向 客户端的请求需要进一步请求才能处理完毕
- 4xx:客户端请求错误
- 5xx:服务端处理错误
HTTP协议的常见状态码:
- 200:请求成功 并且处理完毕 (ok)
- 304:请求被重定向到缓存。(Not Modified)
- 302:请求被重定向到另一个资源 (found)
- 404:请求错误,资源不存在 (not found)
- 400:请求错误,服务端对请求资源不理解 (bad request)
- 401:请求错误,未授权的客户端(unauthorized)
- 403:请求错误,服务端拒绝处理请求(forbidden)
- 500:服务器处理错误 一般都是服务器代码出bug了(server internal error)
3. 实现一个简易的静态服务器(服务器软件)
静态服务器是访问静态资源。
4. 实现一个简易的动态服务器(服务器软件)
动态服务器是可以根据地址去执行对应的请求处理(执行Java代码处理)