【JavaWeb】初识HTTP学习

news2024/11/19 14:37:07

文章目录

  • JavaWeb之HTTP学习
    • 1、HTTP相关基本概念
    • 2、数据格式介绍
      • 2.1 请求的数据格式
      • 2.2 响应的数据格式
    • 案例

JavaWeb之HTTP学习

1、HTTP相关基本概念

  • 什么是HTTP

    HTTP(HyperText Transfer Protocol,超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上

    其主要作用是用于客户端和服务端的通信的规范,即:

    1. 请求:客户端应该发送什么样的请求数据给服务端,规定请求的形式
    2. 响应:服务端收到客服端的请求数据应该做出什么样的响应,规定响应的形式

    image-20220731134741725

    HTTP好比是一座桥梁,用于连接客户端和服务端。类比生活中的事情,当我们要和外国人交流,不可能你说中文、他说日语,这就会导致沟通障碍(当然这个例子也不太恰当,因为有些人可能两种语言都懂),为了方便交流我们就会选择一种语言当作中间语言,而这个中间语言就好比HTTP,中国人和外国人就好比客户端和服务端。

    学习HTTP主要就是学习请求和响应数据的具体格式内容。

  • HTTP的特点

    1)安全可靠。因为HTTP协议是基于TCP协议的

    2)一次请求对应一次响应。因为HTTP是基于请求-响应模型的

    3)对事物的处理没有记忆能力。因为HTTP协议是无状态1协议,对于每次事物的处理都是独立的,所以对事物的处理没有记忆能力

  • HTTP的优点和缺点

    1)优点

    灵活性高扩展性强。每当应用程序需要其他功能时,HTTP都可以下载扩展或插件并显示相关数据

    可靠传输。HTTP是基于TCP协议的

    数据传输快。第一,HTTP对事物处理没有记忆能力,无需在意之前请求和响应的数据;第二,只有当连接建立时,握手过程才会发生在HTTP中。因此,请求之后不会有握手过程。这显着减少了连接中的延迟

    2)缺点

    明文传输不安全。使用HTTP进行明文传输数据,很容易被人通过抓包获取数据

    无法复用同一TCP连接。复用同一个TCP连接会导致队头阻塞2

    多次请求之间的数据无法共享。因为HTTP对事物的处理没有记忆能力,每一次请求-响应都是独立的。(但是Java早已想到了这个问题,所以提出了会话技术CookieSession来解决这个问题Java就是碟

2、数据格式介绍

2.1 请求的数据格式

image-20220801084832683 image-20220801084846699
  • 请求数据的组成请求行+请求头+[请求体]

    1)请求行:位于请求数据的第一行,格式为:请求方式 /请求的资源路径 协议名称/协议版本号 。HTTP的请求方式共有七种3,常见的有两种,分别是GET请求和POST请求

    2)请求头:从第二行开始,格式为:key: value

    常见的请求头:

    • Host: 表示请求的主机名
    • Connection: 请求连接的方式。一般默认是keep-alive,表示请求建立长连接
    • User-Agent: 表示浏览器的版本。例如Chrome浏览器的标识类似Mozilla/5.0 …Chrome/79,IE浏览器的标识类似Mozilla/5.0(Windows NT …)like Gecko
    • Accept:表示浏览器能接收的资源类型。如text/,image/或者*/*表示所有
    • Accept-Language:表示浏览器偏好的语言。服务器可以据此返回不同语言的网页
    • Accept-Encoding:表示浏览器可以支持的压缩类型。例如gzip, deflate等

    3)请求体:位于最后一行,用于存放请求参数,GET请求不具有,格式:key=value&...

  • GET请求和POST请求的区别

    1)请求参数存放位置不同。GET请求没有请求体,请求参数存放在请求行中;而POST请求具有,请求参数存放再请求体中

    2)请求参数的限制不同。GET请求请求参数大小有限制,POST没有

    比较GET与POST

2.2 响应的数据格式

image-20220801090724717
  • 响应数据的组成响应行+响应头+响应体

    1)响应行:位于响应数据的第一行,格式为:协议名称/协议版本号 响应码 状态码

    常见响应码(1xx~5xx):

    状态码分类说明
    1xx响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它
    2xx成功——表示请求已经被成功接收,处理已完成
    3xx重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。
    4xx客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
    5xx服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等
    • 200 ok :客户端请求成功
    • 400:服务端无法识别请求(一般是客户端请求的数据存在语法错误)
    • 404 Not Found :请求资源不存在(一般是URL错误,或者资源被移除)
    • 500 Internal Server Error :服务端发生不可预期的错误(一般是Java代码出现异常,建议去看日志文件)

    状态码大全:HTTP中文开发手册


    推荐阅读:Http响应码分类汇总

    2)响应头:从第二行开始,格式为:key: value

    常见的响应头:

    • Server:表示服务器以及服务器的版本号,例如:Tengine/1.4
    • Content-Type:表示该响应内容的类型,例如:text/html,image/jpeg
    • Content-Length:表示该响应内容的长度(字节数)
    • Content-Encoding:表示该响应压缩算法,例如gzip
    • Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒

    3)响应体:是响应数据的最后一部分,用于存放响应后的数据,是html格式

案例

模拟客户端访问服务端,服务端给发送请求数据

image-20220801230412938

pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hhxy</groupId>
    <artifactId>day5_http</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>16</maven.compiler.source>
        <maven.compiler.target>16</maven.compiler.target>
    </properties>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

    </dependencies>

</project>

Java代码:

package com.hhxy.http;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
/*
    自定义服务器
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //1、获取ServerSocket对象,注册端口号
        ServerSocket ss = new ServerSocket(8080); // 监听指定端口
        System.out.println("server is running...");//测试代码
        //2、重复接收客户端发送的信息
        while (true){
            //3、于客户端建立Socket管道连接
            Socket sock = ss.accept();
            //测试代码,获取远程客户端的IP地址
            System.out.println("connected from " + sock.getRemoteSocketAddress());
            //4、创建线程,并执行任务
            Thread t = new Handler(sock);
            t.start();
        }
    }
}

/**
 * 线程类
 */
class Handler extends Thread {
    Socket sock;//服务端每次接收的来自不同客户端Socket对象

    public Handler(Socket sock) {
        this.sock = sock;
    }

    /**
     * 服务端运行的方法
     */
    public void run() {
        try (InputStream input = this.sock.getInputStream()) {//处理来自客户端的信息
            try (OutputStream output = this.sock.getOutputStream()) {//处理服务端发送的信息
                handle(input, output);//客户端进行响应
            }
        } catch (Exception e) {
            try {
                this.sock.close();
            } catch (IOException ioe) {
            }
            System.out.println("client disconnected.");
        }
    }

    /**
     * 线程类的核心方法:用于服务端处理HTTP请求数据,以及向客户端发送响应数据
     * @param input
     * @param output
     * @throws IOException
     */
    private void handle(InputStream input, OutputStream output) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
        // 读取HTTP请求:
        boolean requestOk = false;
        String first = reader.readLine();
        if (first.startsWith("GET / HTTP/1.")) {
            requestOk = true;
        }
        for (;;) {
            String header = reader.readLine();
            if (header.isEmpty()) { // 读取到空行时, HTTP Header(请求头)读取完毕
                break;
            }
            System.out.println(header);//打印请求行和请求头
        }
        System.out.println(requestOk ? "Response OK" : "Response Error");//打印服务器是否响应成功的信息
        if (!requestOk) {
            // 发送错误响应:
            writer.write("HTTP/1.0 404 Not Found\r\n");
            writer.write("Content-Length: 0\r\n");
            writer.write("\r\n");
            writer.flush();
        } else {
            // 发送成功响应:

            //读取html文件,转换为字符串
            BufferedReader br = new BufferedReader(new FileReader("html/hello.html"));
            StringBuilder data = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null){
                data.append(line);
            }
            br.close();
            int length = data.toString().getBytes(StandardCharsets.UTF_8).length;
            //向客户端发送响应行和响应头的信息
            writer.write("HTTP/1.1 200 OK\r\n");
            writer.write("Connection: keep-alive\r\n");
            writer.write("Content-Type: text/html\r\n");
            writer.write("Content-Length: " + length + "\r\n");
            writer.write("\r\n"); // 空行标识Header和Body的分隔
            //向客户端发送响应体的信息
            writer.write(data.toString());
            writer.flush();
        }
    }
}

image-20220801230542061


  1. 无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息 ↩︎

  2. 队头阻塞简而言之,就是如果一个响应返回延迟了,那么其后续的响应都会被延迟,直到队头的响应送达 ↩︎

  3. 七种方式,分别为:GET方法、POST方法、HEAD方法、PUT方法、DELETE方法、CONNECT方法、OPTIONS方法、TRACE方法 ↩︎

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

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

相关文章

Spring Cloud基本介绍

✨ Spring Cloud基本介绍1.微服务中的相关概念1.1服务的注册与实现1.2负载均衡1.3熔断1.4链路追踪1.5API网关2.Spring Cloud的介绍2.1基本认识2.2Spring Cloud的架构2.2.1Spring Cloud的核心组件2.2.2Spring Cloud体系结构2.3Spring Boot和Spring Cloud的区别与联系2.3.1 Sprin…

【Spring】简单的登录案例和配套知识

本篇文章接着介绍 Spring 的相关知识&#xff0c;主要通过一个非常非常简单用户登录案例来介绍&#xff0c;各位大佬们路过记得赏小的一颗赞&#x1f929; 文章目录1. 演示一下 Spring 管理类的模式2. 用户登录案例2.1 准备的对象和其功能2.1.1 User2.1.2 UserController2.1.3 …

05、JavaWeb启程——JDBC详解

1、JDBC概述 1、持久化概述 【简介】&#xff1a; 持久化指的是把内存中的数据存储到可掉电存储设备中以供之后使用。 2、JDBC概述 【简介】&#xff1a; JDBC是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系型数据库提供统一的访问。 【JDBC本质】&#xff1…

【Java】泛型

当你觉得这条路很难走的时候&#xff0c;一定是上坡路 目录 1.初识泛型 1.1 什么是泛型 1.2泛型类语法 1.2.1泛型类定义 1.2.2泛型类使用语法 1.2.3泛型类的使用 1.2.4裸类型 2.泛型如何编译 2.1擦除机制 3.泛型的上界 3.1语法 3.2示范 4.泛型方法 4.1 语法 …

i.MX 6ULL 驱动开发 十九:RGBLCD

一、RGBLCD 硬件原理 【正点原子MP157连载】第十八章 RGB LCD彩条显示实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7_正点原子的博客-CSDN博客 ATK7016 时序参数&#xff1a; 二、eLCDIF 接口 eLCDIF 是 I.MX6U 自带的液晶屏幕接口&#xff0c;用于连接 RGB …

【Linux】没有GDB,何谈Linux C

一、简单的开始 1、有C代码如下 #include <stdio.h>void main() {printf("Hello World!"); }2、通过gcc编译 生成带有调试信息的可运行程序&#xff0c;编译参数-g gcc -g hello.c -o hello3、运行GDB -q表示不打印gdb版本信息&#xff0c;界面较为干净 …

linux内核调试工具之kprobe

目录 一、内核调试的痛点 二、kprobe的优点 三、kprobe探测点的要点 四、探测点的开销与优化 五、内核配置 六、API 七、程序架构 八、实例 一、内核调试的痛点 内核调试&#xff0c;添加打印信息。在运行过程中想看某个函数的变量&#xff0c;需要重新编译内核。这样破…

【C语言】指针(进阶)

目录一、字符指针二、数组指针2.1、数组指针的定义2.2、&数组名和数组名2.3、数组指针的使用三、数组传参、指针传参3.1、一维数组传参3.2、二维数组传参3.3、一级指针传参3.4、二级指针传参四、函数指针五、函数指针数组六、指向函数指针数组的指针七、回调函数一、字符指…

【C语言小游戏】详解三子棋,深刻掌握二维数组

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#xff0c;今天带领大家实现一个C语言小游戏&#xff0c;主要运用的知识点为二维数组&#xff0c;希望这篇文章让大家对二维数组有更深刻的认识。 &#x1f49e;看似不起波澜的日复一日&#xff0c;会突然在某一天让人看到坚持…

【day14】【洛谷算法题】-P5711闰年判断-刷题反思集[入门2分支结构]

&#x1f338;大家好&#xff0c;我是花无缺&#xff0c;一枚热爱生活的新时代青年&#xff0c;感谢你的阅读&#x1f970;~ &#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专…

PC - 史上最简单的远程访问群晖 NAS 方法

文章目录1、下载安装cpolar群晖套件1.1 注册cpolar账号1.2 下载cpolar群晖套件1.3 安装cpolar群晖套件2、创建隧道映射5000端口2.1 打开cpolar群晖套件2.2 创建远程访问隧道2.3 获取公网URL地址3、公网远程群晖NAS教大家一个新手小白都可以轻松掌握的远程群晖NAS方法&#xff0…

算法的时间复杂度和空间复杂度

文章目录算法的时间复杂度和空间复杂度算法效率算法的复杂度时间复杂度时间复杂度的概念大O的渐进表示法常见的时间复杂度计算举例空间复杂度常见复杂度对比复杂度的oj练习算法的时间复杂度和空间复杂度 算法效率时间复杂度空间复杂度常见的时间复杂度以及复杂度的oj练习 算法…

【题解】方格取数

&#x1f60a;博主目前也在学习&#xff0c;有错误欢迎指正&#x1f60a; &#x1f308;保持热爱 奔赴星海&#x1f308; 文章目录一、题目1、题目描述3、原题链接二、解题报告1、思路分析2、代码详解三、本题知识一、题目 1、题目描述 输入格式&#xff1a; 输入的第一行为一…

Java并发编程实战之互斥锁

文章目录Java并发编程实战之互斥锁如何解决原子性问题&#xff1f;锁模型Java synchronized 关键字Java synchronized 关键字 只能解决原子性问题&#xff1f;如何正确使用Java synchronized 关键字&#xff1f;锁和受保护资源的合理关联关系死锁预防死锁破坏占有且等待条件破坏…

字节一面:TCP 三次握手,问的好细!

大家好&#xff0c;我是小林。 有位读者在面试字节时&#xff0c;被问到这么个问题&#xff1a; 概括起来&#xff0c;是这两个问题&#xff1a; TCP 三次握手中&#xff0c;客户端收到的第二次握手中 ack 确认号不是自己期望的&#xff0c;会发生什么&#xff1f;是直接丢弃…

1024程序员节:从关注自身健康开始

今天是1024程序员节&#xff0c;我们已经历经了尽三年的疫情&#xff0c;健康是我们最应该关注的事情&#xff0c;在这个特别的日子里&#xff0c;希望程序员们都能更加爱惜自己的身体&#xff0c;少加班&#xff0c;多锻炼。 健身不仅是保持健康体魄的关键要素之一&#xff0c…

基于ssm高校科研管理系统-计算机毕业设计源码+LW文档

【摘 要】高校科研管理是一项重要而又繁琐的工作&#xff0c;有效的信息管理平台可以大大缓解科研管理压力&#xff0c;减少工作量。本文以石河子大学信息科学与技术学院为应用背景&#xff0c;开发教师教学信息与论文信息交流平台。该系统能对科研成果和课题进行较为全面的管理…

第十三届蓝桥杯C++B组国赛I题——齿轮 (AC)

目录1.齿轮1.题目描述2.输入格式3.输出格式4.样例输入5.样例输出6.样例说明6.数据范围7.原题链接2.解题思路3.Ac_code1.齿轮 1.题目描述 这天, 小明在组装齿轮。 他一共有 nnn 个齿轮, 第 iii 个齿轮的半径为 rir_{i}ri​, 他需要把这 nnn 个齿轮按一定 顺序从左到右组装起来…

[附源码]Java计算机毕业设计SSM公司办公自动化系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

10个实用的CSS样式之悬浮卡片

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位喜欢写作&#xff0c;计科专业大三菜鸟 &#x1f3e1;个人主页&#xff1a;starry陆离 &#x1f4da;订阅专栏&#xff1a;『10个实用的CSS样式』 10个实用的CSS样式之悬浮卡片1.简介2.布局设计3.样式美化3.1body美化3.2c…