【JavaWeb】初识HTTP学习
创始人
2024-01-16 18:24:33
0

文章目录

  • 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文件:


4.0.0com.hhxyday5_http1.0-SNAPSHOT1616commons-iocommons-io2.6

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方法 ↩︎

上一篇:vite基础知识-1

下一篇:熟人

相关内容

热门资讯

学校揭牌仪式致辞 学校揭牌仪式致辞范文(精选11篇)  在社会一步步向前发展的今天,用到讲话稿的地方越来越多,讲话稿具...
学生会副主席就职发言稿 学生会副主席就职发言稿范文(通用6篇)  在快速变化和不断变革的新时代,发言稿的使用频率越来越高,发...
100米加油稿 100米加油稿(通用17篇)  在学习、工作生活中,我们都不可避免地要接触到加油稿,借助加油稿往往可...
学习经验交流发言稿 学习经验交流发言稿一年级的学弟学妹们:你们好!上周日晚上,学校通知我让我来给大家做学习经验交流,我听...
学生会文体部竞选稿 学生会文体部竞选稿大家好,我是XX,隶属XXX班,现任学委一职。在文艺魅力的驱使下,我与她有着很深的...
《海上日出》优秀说课稿 《海上日出》优秀说课稿  作为一名老师,就有可能用到说课稿,借助说课稿可以有效提高教学效率。我们应该...
中班的数学《梯形》活动说课稿 中班的数学《梯形》活动说课稿范文  作为一名教学工作者,时常需要用到说课稿,通过说课稿可以很好地改正...
古诗咏柳的说课稿 古诗咏柳的说课稿范文(精选5篇)  作为一名默默奉献的教育工作者,有必要进行细致的说课稿准备工作,借...
高中运动会加油稿 运动场上,运动健儿在跑道上跑着,只为争取那胜利的光芒,高中运动会加油稿。2017高中运动会加油稿范文...
《世上只有一个我》公开课的评... 《世上只有一个我》公开课的评课稿  聆听了王红军老师的作文示范课《世上只有一个我》之后,让我印象深刻...
《购物》说课稿 《购物》说课稿  作为一位兢兢业业的人民教师,总归要编写说课稿,说课稿有助于提高教师理论素养和驾驭教...
小学生教师节朗诵稿 小学生教师节朗诵稿范文(通用21首)  在日新月异的现代社会中,说到朗诵稿,大家肯定都不陌生吧,朗诵...
《我的母亲》说课稿 《我的母亲》说课稿  一、说教材  1、教材分析与教学目标的确立  《我的母亲》是苏教版第三单元“至...
级新生开学典礼发言稿 级新生开学典礼发言稿尊敬的院领导、老师们、同学们:大家好!今天是2005级新生开学典礼,这是一个喜庆...
《学会合理消费》说课稿 《学会合理消费》说课稿  本课的题目是《学会合理消费》。下面我从教材地位、教学目标、重难点、教学手段...
小学新教师代表发言稿 小学新教师代表发言稿小学新教师代表发言稿大家好,我是我们学校的新教师喻俊伟,今天在此做新教师代表发言...
《爱迪生救妈妈》说课稿 《爱迪生救妈妈》说课稿范文(精选3篇)  作为一位杰出的教职工,有必要进行细致的说课稿准备工作,借助...
《桂花雨》的说课材料 《桂花雨》的说课材料范文  还是在六月初,偶然在报纸读到一条消息:现代著名女作家、在华语文坛享有盛誉...
《这儿真好》说课稿 《这儿真好》说课稿  在教学工作者实际的教学活动中,就不得不需要编写说课稿,写说课稿能有效帮助我们总...
《十六年前的回忆》说课稿 《十六年前的回忆》说课稿范文(精选3篇)  作为一名教师,常常要根据教学需要编写说课稿,写说课稿能有...