?1、概念
????????协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。
2、三要素
(1)语法:即数据与控制信息的结构或格式;
(2)语义:即需要发出何种控制信息,完成何种动作以及做出何种响应;
(3)时序(同步),即事件实现顺序的详细说明。
????????是对数据格式和计算机之间交换数据时必须遵守的规则的正式描述。简单的说,网络中的计算机要能够互相顺利的通信,就必须讲同样的语言,协议就相当于语言,它分为Ethernet、NetBEUI、IPX/SPX以及TCP/IP协议。?
3、协议的分层
????????协议往往分成几个层次进行定义,分层定义是为了使某一层协议的改变不影响其他层次的协议。
ISO/OSI协议模型
? ? ? ?国际标准化组织(ISO)为了规范协议层次的划分制定了开发系统互联(OSI,Open Systems Interconnection)模型,即ISO/OSI参考模型。此模型根据网络功能制定出7层网络协议结构,由低到高分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
协议的分层
应用层 | 应用层是ISO/OSI模型中最靠近用户的一层,应用层协议直接面对用户的需求,例如与发送邮件相关的应用层协议可以规定诸如邮件地址的格式、邮件内容的段落表示、客户与服务器进行交互的命令串等。 | 表示层 | 表示层协议规定对来自应用层的数据如何进行表达,例如采用什么样的文字编码、是否及如何进行压缩、是否及如何加密等。 | 会话层 | 会话层用于建立和管理不同主机的两个进程之间的对话。会话层可以管理对话,可允许对话在两个方向上同时进行,也可以强制对话同时只在一个方向上进行。 | 传输层 | 依赖物理层、数据链路层和网络层,任意一个网络节点都能把任何信息传递到其他任意节点,而传输层在物理层、数据链路层和网络层提供的节点间的通信能力基础上进一步提供了面向应用的服务。 | 网络层 | 解决如何标识通信各方和数据如何从源到达目的这个问题。网络层用特定的网络层地址来标识整个网络中的一个节点,并负责使来自传输层的应该到达某个网络层地址的数据能够被送达这个网络层地址所对应的网络节点。 | 数据链路层 | 简称链路层,它依赖物理层提供的比特传输能力把数据组织成为有边界的传输单位,称为“帧”。链路层把来自网络层的数据组织成“帧”,然后再通过物理层向外发送。 | 物理层 | 简单地说,物理层协议对与基本物理信号传输有关的机械、电气等功能进行描述。若生产相互连接的两个设备的两个厂商都遵循相同物理层规范 |
4、常用协议
- TCP/IP协议:毫无疑问是这三协议中最重要的一个,作为互联网的基础协议,没有它就根本不可能上网,任何和互联网有关的操作都离不开TCP/IP协议。不过TCP/IP协议也是这三大协议中配置起来最麻烦的一个,单机上网还好,而通过局域网访问互联网的话,就要详细设置IP地址,网关,子网掩码,DNS服务器等参数。
- NetBEUI:即NetBios Enhanced User Interface ,或NetBios增强用户接口。它是NetBIOS协议的增强版本,NetBEUI协议是一种短小精悍、通信效率高的广播型协议,安装后不需要进行设置,特别适合于在“网络邻居”传送数据。所以建议除了TCP/IP协议之外,小型局域网的计算机也可以安上NetBEUI协议。另外还有一点要注意,如果一台只装了TCP/IP协议的WINDOWS98机器要想加入到WINNT域,也必须安装NetBEUI协议。
- IPX/SPX协议本来就是Novell开发的专用于NetWare网络中的协议,但是也非常常用--大部分可以联机的游戏都支持IPX/SPX协议,比如星际争霸,反恐精英等等。
5、HTTP协议?
- ??http协议:客户端浏览器和web服务器数据传输的格式的规范
- 查看协议的工具:谷歌浏览器:打开调试工具(F12),进入network菜单,查看headers
- 协议内容:请求头、响应
6、HTTP请求
- 请求行
- 请求头
- 实体内容
- HttpServletRequest对象
- service和doxxx方法区别
- 传递的请求参数如何获取
- 请求参数的编码问题
①请求行:
请求行:GET /day05/login?account=admin&password=123 http/1.1
请求资源:http://localhost:8080/day05/login?account=admin&password=123
http:协议
localhost:主机域名,可以是ip
8080:主机端口,每个端口都会映射一个网络程序(tomcat)
Login: 服务端资源
?account=admin&password=123:请求参数,客户端给服务端发送的用户的数据
URL:统一资源定义符,代表一个网络资源,是URI的子类
URI:统一资源标识符,代表一个网络资源还能代表本地资源:
file:///C:/Users/NING%20MEI/Desktop/login.html
请求方式:浏览器默认只支持get post两种请求方式! ? ??1?? ?GET?? ?请求指定的页面信息,并返回实体主体。 ?? ?2?? ?HEAD?? ?类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 ?? ?3?? ?POST?? ?向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 ?? ?4?? ?PUT?? ?从客户端向服务器传送的数据取代指定的文档的内容。 ?? ?5?? ?DELETE?? ?请求服务器删除指定的页面。 ?? ?6?? ?CONNECT?? ?HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 ?? ?7?? ?OPTIONS?? ?允许客户端查看服务器的性能。 ?? ?8?? ?TRACE?? ?回显服务器收到的请求,主要用于测试或诊断。 ?? ?9?? ?PATCH?? ?是对 PUT 方法的补充,用来对已知资源进行局部更新 。
GET ??vs ?POST 区别
1)GET方式提交?
http://localhost:8080/day05/login?account=admin&password=123
上面的地址就是典型的get请求
使用方式:
- 凡是通过浏览器地址栏输入url敲回车访问的资源,这个时候的请求方式一定是get请求
- 表单的method属性设置为get的时候,是get请求,表单默认的请求方式就是get
特征:1)请求参数是使用?拼接在url的后面进行传输的
? ? ? ? ? ?2)由于请求参数拼接在url后面,长度受到url长度的限制,不能超过1k
? ? ? ? ? ?3)参数拼接在url后面明码展示。不安全
2)POST方式提交
http://localhost:8080/day05/login
上面的地址就是典型的post请求,url后面没有请求参数
使用方式:1.表单的method属性设置为post,才会发起post请求
特征:1)请求参数保存在请求体中
? ? ? ? ? ?2)请求体中的数据使用流传输,理论上对里面的请求参数的长度没有要求
? ? ? ? ? ?3)地址栏看不到参数,所以安全
②请求头:
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 --客户端支持的数据类型
Accept-Encoding: gzip, deflate, br --客户端支持的数据的压缩格式
Accept-Language: zh-CN,zh;q=0.9 -- 客户端的语言环境
Cache-Control: max-age=0 --是否使用缓存
Connection: keep-alive --链接方式
Content-Length: 26 --发送数据请求体中请求参数(字符串)的长度
Content-Type: application/x-www-form-urlencoded --发送数据的类型,如果表单中包含了上传文件,不用这个值
Host: localhost:8080 --客户端请求的服务器的主机的地址
Origin: null
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36 --客户端支持的浏览器类型和操作系统
③请求体:平时没有数据,只有post请求的时候,请求参数保存在里面进行发送
④HttpServletRequest对象
- 服务端程序我们主要学习servlet
- 请求的内容都被tomcat封装到了HttpServletRequest对象中
- 我们就需要在服务端程序servlet中,使用request对象提供的api获取请求的内容
- 如何获取:servlet对应的do方法的形参中,直接获取
请求行相关:
getMethod():获取请求类型,就是表单的method属性的值
getProtocol():获取请求的协议名称
getRequestURI():/day05/login ?请求资源的服务器内的地址
getRequestURL():http://localhost:8080/day05/login??请求的资源的地址
getContextPath():获取项目路径的名称
请求头相关:
getHeader(String headerName):根据请求头的名称获取指定的请求头的值
getHeaderNames():获取所有的请求头的名称的集合
请求体相关:
getInputStream():获取请求体的内容(post请求的时候使用)
⑤service 和?doXX方法区别
1.Service()是servlet的入口方法,servlet处理请求的时候,总是先执行service方法
2.我们自己写的servlet执行的时候,还是先执行service方法,如果我们没有重写service方
法,就会执行父类(HttpServlet)的service方法
3.如果我们的servlet没有重写service方法,就会根据请求方式去调用对应的doxxx()
4.service方法能处理任意类型的请求,但是doxxx方法只能处理对应的请求
5.开发中我们一般都是重写doxxx方法,可以对请求方式作出限定
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
⑥传递的请求参数如何获取
我们写的servlet的主要任务就是获取用户的请求参数
Get请求和Post请求两种方式的请求参数获取的方法是不同的
? ? ? ? 1、get请求:请求参数在url后面
获取api:getQueryString(),返回url问号后面的字符串
????????2、post请求:请求参数在请求体中
获取api:getInputStream()
无论get还是post对于请求参数的获取都是很麻烦的,所以java给我们提供了一个通用
的,简单的方法:getParameter(String param),有多少个参数就需要使用几次方
法获取,该方法不能获取复选框的值
复选框的值使用getParameterValues(String param)获取,返回一个字符串数组
⑦请求参数编码问题
Get请求获取请求参数的时候中文没有乱码:
1.Tomcat8之前的版本,tomcat的默认字符集是iso-8859-1,我们工程使用utf-8,在
servlet中获取请求参数,中文会乱码?
account = new String(account.getBytes("iso-8859-1"),"utf-8");
2.8以及之后的版本,tomcat的默认字符集是utf-8,所以中文没有乱码了
Post请求获取请求参数的时候中文出现乱码:
- 在获取请求参数之前,设置请求的字符集
req.setCharacterEncoding("utf-8");
7、HTTP响应
- 响应行
- 响应头
- HttpServletResponse对象
- 请求和重定向
- 定时刷新
- content-Type作用
①响应行
HTTP/1.1 200 OK
200 是状态码
Ok??是状态码的描述信息
常见的响应状态码:
????????200 ???请求成功,返回成功
????????302 ???请求的资源被重定向了
????????404 ???资源不存在或者不允许访问
????????500 ??服务端程序出错了
②常见的响应头
Bdpagetype: 1
Bdqid: 0x892a050300604c6c
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8 -- 表示响应的结果是什么类型的数据
Date: Sat, 27 Feb 2021 01:38:28 GMT
Expires: Sat, 27 Feb 2021 01:38:05 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=33518_33344_31253_33595_33570_33600_26350_33266; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 161438990828107530349883717842667326572
Transfer-Encoding: chunked
X-Ua-Compatible: IE=Edge,chrome=1
Content-Disposition:-- 下载的时候用来表示下载的文件使用附件的形式另存为,并制定默认的文件名
Content-Length: --响应数据的长度
Location: -- 重定向跳转资源
Refresh: -- 用于实现定时刷新页面,如果没有指定页面,默认刷新当前页面
Status: -- 指定响应状态码
③HttpServletResponse对象
响应是服务端设置完成后,返回给浏览器读取,所以我们可以设置响应头
?响应对象是tomcat创建完成后作为出入service方法和doxxx方法的
?设置响应头需要通过HTTPServletResponse对象的api实现
?设置请求头相关api:
- setHeader(String key,String value)? ?设置响应头
- sendError(int var1, String var2) ?发送错误响应状态码和描述信息
- sendRedirect(String url) ?????????实现重定向方式的跳转资源
- setStatus(int status) ????????????设置响应状态码
④案例-请求重定向(Location)
重定向跳转有两种方式:
? ? ? ? 1、复杂的:
? ? ? ? ? ? ? ? resp.setStatus(302);
? ? ? ? ? ? ? ? resp.setHeader(“Location”,"success.html");
? ? ? ? 2、简单的:
? ? ? ? ? ? ? ? sendRedirect(“Location”,“success.html”);
重定向跳转的资源不是只有页面的,还可以重定向到servlet
重定向跳转后,会改变浏览器中的url
⑤案例-定时刷新(refresh)
resp.setHeader("Refresh","3");当前页面3秒钟后刷新
resp.setHeader("Refresh","3;url=success.html");3秒钟后重定向指定页面
⑥案例content-Type作用
??resp.setHeader("Content-Type","text/html;charset=utf-8");
??当我们使用流向浏览器返回数据的时候,可以使用上面的代码表示返回数据的类型和字符集
???resp.setContentType("text/html;charset=utf-8"); 这句代码等效于上面代码
//设置返回的数据是文件
resp.setContentType("image/*");
//设置图片以附件的形式下载
resp.setHeader("Content-Disposition","attachment; filename=\"123.jpg\"");
//使用流读取本地图片,在使用响应的输出流输出到浏览器
FileInputStream fis = new FileInputStream("D:\\1.jpg");
OutputStream os = resp.getOutputStream();
byte[] bs = new byte[1024];
int length = 0;
while ((length = fis.read(bs)) != -1){
os.write(bs,0,length);
}
fis.close();
os.close();
总结:
协议:提供请求方式和数据传递
传输:
TCP协议:长链接协议(jdbc),安全可靠,三次握手,性能较低一些
UDP协议:无连接协议,不安全可靠,性能高一些,例如:下载、视频……
网络:
IP地址协议:IP地址是网络中唯一标识这台主机
????????MAC地址:物理地址,全球唯一标识这台主机,48位16进制数据
***几乎所有协议都是基于 TCP/IP协议和UDP/IP协议
Http协议:是基于TCP/IP协议的基础之上,封装的短链接协议、无状态
? ? ? ? 从Session中获取数据:HttpSession是基于cookie的,从Cookie中获取数据
短链接:连接->传输数据->关闭连接? | 亦或者是SOCKET连接后,发送接收完数据后马上断开连接。
? ? ? ? 例:HTTP是无状态短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接
????????具体就是 浏览器client发起并建立TCP连接 -> client发送HttpRequest报文 -> server接收到报文->server handle并发送HttpResponse报文给前端,发送完毕之后立即调用socket.close方法->client接收response报文->client最终会收到server端断开TCP连接的信号->client 端断开TCP连接,具体就是调用close方法。?
长链接:连接->传输数据->保持连接 -> 传输数据-> ………..->直到一方关闭连接,多是客户端关闭连接。 | 亦或是建立SOCKET连接后不管是否使用都保持连接,但安全性较差
? ? ? ? 例:jdbc连接数据库
?
|