初识HTTP协议

Web服务器可以接收浏览器的请求,并将服务器中的web项目资源响应给浏览器,浏览器与服务器之间进行网络通信遵循HTTP协议。

一、什么是HTTP协议

超文本传输协议(HTTP,HyperText Transfer Protocol)(浏览器---->web服务器)

网络中的通信协议:

  • TCP协议,基于连接的安全传输协议(客服端和服务器先建立连接,再通过连接发送数据)
  • UDP协议,基于广播/分发的非安全传输协议(不建立网络连接)

HTTP超文本传输协议是运行于TCP协议的基础之上、基于请求与响应模式、无状态的应用层协议,是互联网中应用最为广泛的一种协议。

二、HTTP协议特点

①基于连接通信:当浏览器与服务器进行通信时,会首先建议网络连接,通过网络连接进行通信

  • 短连接:在HTTP1.0中,浏览器向服务器发送请求,建立连接,但是在这个连接只作用于浏览器和服务器的一次请求响应,这次请求响应完成之后则断开连接。

  • 长连接:在HTTP1.1中,浏览器请求与服务器建立连接、进行请求和响应之后,会等待几秒钟,在这几秒内如果浏览器有新的请求,则直接使用之前的这个连接进行请求和数据响应,如果过了几秒钟没有新的请求,则将连接断开。

②请求与响应模式:首先由浏览器向服务器发送请求,服务器再对请求进行响应,如果没有浏览器的请求服务器时不会主动向浏览器进行响应的。

③无状态:服务器不会感知同一个客户端的多次请求(就是当服务器接收到客户端请求之后,不能识别这个客户端是否请求过我)

④简单灵活:实现简便、可以传输不同类型的数据(客户端---文件\文本--->服务器)

三、HTTP协议通信规则

通信协议:客户端与服务器之间共同遵守的规则

HTTP协议是请求和响应模式,浏览器向服务器发送请求时,需要遵守HTTP请求规则,服务器对浏览器进行响应时也遵守HTTP响应规则。

1、HTTP请求规则

说明:当在浏览器中发送请求时,浏览器已经实现了HTTP请求协议,基于这个协议发送请求的。

通过浏览器查看步骤(这种方式没法看到所有的HTTP请求内容):

  • 打开浏览器
  • F12打开调试窗口、点击network
  • 在浏览器输入网址进行访问
  • 在network窗口中查看请求头信息(Request Headers)

2、通过自定义的HTTP服务器,接收浏览器请求,查看HTTP请求规则:

  • 自定义HTTP服务器:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class MyHttpServer {public static void main(String[] args) throws IOException {//创建一个网络服务器(可以通过浏览器请求这个服务)ServerSocket serverSocket = new ServerSocket(9999);//当浏览器请求我这个服务器之后,就建立网络连接(socket对象)Socket socket = serverSocket.accept();//通过socket对象的输入流,可以读取 浏览器发送的HTTP请求InputStream inputStream = socket.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));//读取 浏览器发送的HTTP请求String content = null;while((content = reader.readLine()) != null){System.out.println(content);}//暂时未对浏览器请求进行响应}
}
  • HTTP请求内容: 

 3、HTTP响应规则

  • 自定义浏览器
import jdk.internal.util.xml.impl.Input;
import java.io.*;
import java.net.Socket;public class MyBrowser {public static void main(String[] args) throws IOException {//将上一个案例中浏览器发送给 MyHttpServer的 http请求内容,发送给百度// 1.向百度服务器发送链接请求Socket socket = new Socket("www.baidu.com", 80);// 2.通过链接中的输出流,将HTTP请求内容发送给百度OutputStream outputStream = socket.getOutputStream();PrintWriter out = new PrintWriter(outputStream);out.println("GET /s HTTP/1.1");out.println("Host: www.baidu.com:80");out.println("Connection: keep-alive");out.println("sec-ch-ua: \"Google Chrome\";v=\"95\", \"Chromium\";v=\"95\", \";Not A Brand\";v=\"99\"");out.println("sec-ch-ua-mobile: ?0");out.println("sec-ch-ua-platform: \"Windows\"");out.println("Upgrade-Insecure-Requests: 1");out.println("User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36");out.println("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");out.println("Sec-Fetch-Site: none");out.println("Sec-Fetch-Mode: navigate");out.println("Sec-Fetch-User: ?1");out.println("Sec-Fetch-Dest: document");out.println("Accept-Encoding: gzip, deflate, br");out.println("Accept-Language: zh-CN,zh;q=0.9");out.println("");out.flush();//3.通过输入流接受百度的响应数据(HTTP响应规则)BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String responseContent = null;while( (responseContent = reader.readLine())!=null){System.out.println(responseContent);}}
}
  • HTTP响应内容

  •  使用自定义HTTP服务器响应浏览器请求(遵循HTTP响应规则)

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class MyHttpServer {public static void main(String[] args) throws IOException {//创建一个网络服务器(可以通过浏览器请求这个服务)ServerSocket serverSocket = new ServerSocket(9999);//当浏览器请求我这个服务器之后,就建立网络连接(socket对象)Socket socket = serverSocket.accept();//通过socket对象的输入流,InputStream inputStream = socket.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));//读取 浏览器发送的 HTTP请求String content = null;while( !"" .equals(content = reader.readLine())){System.out.println(content);}// 自定义HTTP服务器响应浏览器PrintWriter out = new PrintWriter(socket.getOutputStream());out.println("HTTP/1.1 200 OK");out.println("Connection: keep-alive");out.println("Content-Length: 154");out.println("Content-Type: text/html;charset=utf-8");out.println("Date: Sun, 07 Nov 2021 17:52:42 GMT");out.println("Location: https://www.baidu.com/");out.println("P3p: CP=\" OTI DSP COR IVA OUR IND COM \"");out.println("P3p: CP=\" OTI DSP COR IVA OUR IND COM \"");out.println("Server: BWS/1.1");out.println("X-Frame-Options: sameorigin");out.println("X-Ua-Compatible: IE=Edge,chrome=1");out.println("");out.println("<!DOCTYPE html>");out.println("<html>");out.println("<head>");out.println("<title>这是自定义服务器响应的页面</title>");out.println("</head>");out.println("<body>");out.println("<label style='color:red'>这是自定义服务器响应的内容</label>");out.println("</body>");out.println("</html>");out.flush();out.close();}}

4、HTTP响应状态码

响应状态码分类

  • 1xx 表示浏览器请求服务器,服务器未做任何操作

  • 2xx 表示服务器正常响应,并且响应成功

  • 3xx 表示服务器只对浏览器的请求进行了部分处理,通知浏览器进行下一步操作

  • 4xx 表示浏览器端(客户端)错误:404、401

  • 5xx 表示服务器端资源错误

常见状态码

  • 200 表示响应成功

  • 302 表示服务器临时重定向

  • 304 表示服务器资源没有变化

  • 404 访问的资源不存在

  • 500 访问的服务器端资源错误

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++汇编学习(三)——指令集-汇编基础

汇编语言是一种用于与计算机硬件直接交互的低级编程语言。它非常接近机器语言&#xff0c;但提供了更易于理解的符号来表示机器指令和数据。不同的处理器架构有不同的汇编语言。例如&#xff0c;x86架构用于大多数个人电脑&#xff0c;而ARM架构常见于移动设备。 目录 1. 指令…

微信小程序:flex常用布局

在我们平时微信小程序开发过程中为了页面能达到设计小伙伴的预期&#xff0c;追求还原度&#xff0c;那我们肯定会使用很多常用的布局方式&#xff0c;那我们今天就介绍一下微信小程序中常用的一些flex布局 1、常用flex布局 /** 水平垂直居中 **/ .flex-center {display: fle…

vue3+vant4 移动端软键盘弹出 收起导致项目样式布局错乱解决方案,亲测有效!!

问题描述 最近在做vue3 H5的移动端项目 我用的是vue3vant4&#xff0c;然后在使用过程中发现 小米14手机在点击密码输入框软键盘弹出 时会导致项目布局整体向上移动 导致页面布局错乱。 原因分析&#xff1a; 在移动端软键盘弹出收起时&#xff0c;导致项目样式布局错乱的原因…

基于STM32的ESP8266 WiFi模块数据采集与显示

基于STM32的ESP8266 WiFi模块数据采集与显示是一种常见的嵌入式系统应用&#xff0c;通常用于远程数据监测和控制。在这种应用中&#xff0c;STM32作为主控制器负责采集周围环境的数据&#xff0c;通过ESP8266 WiFi模块将数据发送到远程服务器&#xff0c;并在远程服务器上进行…

03-微服务-Ribbon负载均衡

Ribbon负载均衡 1.1.负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1&#xff0c;怎么变成了http://localhost:8081的呢&#xff1f; 1.2.源码跟踪 为什么我们只输入…

小梅哥Xilinx FPGA学习笔记20——无源蜂鸣器驱动设计与验证(音乐发生器设计)

目录 一&#xff1a;章节导读 二&#xff1a;无源蜂鸣器驱动原理 三&#xff1a;PWM 发生器模块设计 3.1 PWM 发生器模块框图 3.2 PWM 发生器模块接口功能描述 3.3 PWM波生成设计文件代码 3.4 测试仿真文件 3.5 测试仿真结果 3.6 板级调试与验证之顶层文件设计 四&am…

Python:界面开发,wx入门篇

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/3Yb_YAKiMte_f5HanetXiA 本文大概 3617 个字&#xff0c;阅读需花 10 分钟 内容不多&#xff0c;但也花了一些精力 如要交流&#xff0c;欢迎评…

@Scheduled定时任务现状与改进

项目场景&#xff1a; 定时任务现状&#xff1a;每个项目都会有一些配置信息&#xff0c;这些信息我们是都放在一个配置服务中&#xff0c;这个服务会定时从配置表中加载所有配置存入本地JVM内存&#xff0c;以供调用方获取&#xff08;调用方集成了配置服务的SDK&#xff0c;…

elasticsearch的查询方式和数据库事务隔离级别的思考

项目中用到了 elasticsearch&#xff0c;发现有几种查询方式不太一样&#xff0c;思考了一下&#xff0c;总结如下 普通分页 等同于关系数据库的分页查询&#xff0c;例如 mysql 的 limit&#xff0c;如下 sql select * from test limit 100000,10 这种查询方式有一个问题&a…

K8S学习指南(62)-K8S源代码走读之Kube-Scheduler

文章目录 前言Kube-Scheduler 的代码结构Kube-Scheduler 的核心逻辑1. 调度框架1.1 阶段划分1.2 阶段执行 2. 调度算法2.1 优先级函数2.2 优选函数 3. 调度器插件3.1 预选插件3.2 优选插件3.3 绑定插件 4. 节点选择4.1 候选节点选择4.2 节点权重计算 5. 调度事件处理5.1 调度事…

系列十一、(一)Sentinel简介

一、Sentinel简介 1.1、官网 【英文文档】 https://github.com/alibaba/Sentinel/wiki【中文文档】 https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5 1.2、概述 1.3、功能

网络路由跟踪工具

随着企业网络需求的增长&#xff0c;组织发现监控和管理其网络基础设施变得越来越困难。网络管理员正在转向其他工具和资源&#xff0c;这些工具和资源可以使他们的工作更轻松一些&#xff0c;尤其是在故障排除方面。 目前&#xff0c;网络管理员主要使用简单、免费提供的实用…

Jvm垃圾收集器系列之G1的小知识(个人见解仅供参考)

问&#xff1a;G1收集器有哪些主要特点&#xff1f; 答&#xff1a;G1收集器的主要特点包括&#xff1a;面向服务器、高吞吐量、满足GC停顿时间要求、将Java堆划分为多个大小相等的独立区域&#xff08;Region&#xff09;、保留了年轻代和老年代的概念但不再是物理隔阂、对大对…

在win10上cuda12+tensorrt8.6+vs2019环境下编译paddle2.6生成python包与c++推理库

paddle infer官方目前没有发布基于cuda12的c库&#xff0c;为此参考https://www.paddlepaddle.org.cn/inference/user_guides/source_compile.html实现cuda12的编译安装&#xff0c;不料博主才边缘好自己的paddle2.6&#xff0c;paddle官方已经发布了cuda12.0的paddle2.6框架。…

C++ 学习系列 -- using关键字

一 概述 c 11 中新引入了关键字 using 二 using 关键字的用处 1. using namespace 与 using namespace member #include<vector> #include<list>int main() {using namespace std;vector<int> vec {1, 2, 3};using std::list;list<int> li {1,…

C++使用openssl的EVP对文件进行AES-256-CBC加解密

1、背景 有项目需求&#xff0c;有对文件进行加密的功能&#xff0c;经过评估&#xff0c;最终决定使用AES-256-CBC加密。在C中要实现这种加密有很多中方式和第三方库&#xff0c;由于运行环境的限制&#xff0c;可选择的库不多&#xff0c;最终决定使用openssl来进行。 关于AE…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)Buffer的创建和销毁、扩容、写入数据

TcpConnection:封装的就是建立连接之后得到的用于通信的文件描述符&#xff0c;然后基于这个文件描述符&#xff0c;在发送数据的时候&#xff0c;需要把数据先写入到一块内存里边&#xff0c;然后再把这块内存里边的数据发送给客户端&#xff0c;除了发送数据&#xff0c;剩下…

Jvm垃圾收集器系列之CMS收集器(个人见解仅供参考)

问&#xff1a;什么是CMS收集器&#xff1f; 答&#xff1a;CMS&#xff08;Concurrent Mark Sweep&#xff09;收集器是Java HotSpot虚拟机中的一种垃圾收集器&#xff0c;主要用于实现低延迟的垃圾回收。 问&#xff1a;CMS收集器的主要目标是什么&#xff1f; 答&#xff1a…

基于综合特征的细菌噬菌体宿主预测工具iPHoP (Integrated Phage HOst Prediction)的介绍以及使用方法详细流程

介绍 iPHoP&#xff08;Integrated Phage HOst Prediction&#xff09;是一种基于综合特征的细菌噬菌体宿主预测方法。它是通过整合基因组序列、蛋白质序列和宿主基因组信息来预测细菌噬菌体的宿主范围。 iPHoP的预测过程分为三个步骤&#xff1a;特征提取、特征选择和宿主预…

Ubuntu22.04无法启动EasyConnect的问题

转自&#xff1a;https://juejin.cn/post/7121236352032571422 无法启动主要是因为依赖包版本高&#xff0c;不兼容&#xff0c;要降级 解决方法&#xff1a; 1、安装easyconnect&#xff08;已安装就跳过&#xff09; 2、EasyConnect的安装位置在 /usr/share/sangfor/EasyCon…