从java的socket中体会http协议

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

前言:http协议经常作为面试的考点,自己之前对其还不是很了解,直到面试时被问到一个关于http协议的问题,才恍然大悟。下面分享一下。

一. http协议入门

1.1 简介

http协议是从服务器传输超文本到本地浏览器的传送协议,是基于 TCP/IP 协议来传递数据(HTML 文件、图片文件、查询结果等) ,默认使用80端口。

1.2 http报文

Http报文包括请求报文响应报文两大部分,其中请求报文由请求行(request line)、请求头(header)、空行和请求体四个部分组成。而响应报文由状态行、响应头部、空行和响应体四个部分组成。

1.2.1 请求报文

  1. 请求行

    用来说明请求类型、要访问的资源、以及所使用的HTTP版本。如:

    POST /1.jpg HTTP/1.1
    
  2. 请求头

    由 key/value 对组成,每行一对,关键字和值之间冒号":"分割。常见的有:

    • Host:主机和端口号
    • Connection:表示是否需要持久连接(HTTP 1.1默认进行持久连接),持久连接的优点就是当页面包含多个元素时显著地减少下载所需要的时间。
    • Content-Length:表示请求消息正文的长度
    • Cookie:这是最重要的请求头信息之一
    • Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面(一个网站统计流量来源就是用的这个)
    • Accept:浏览器可接受的MIME类型
    • Accept-Charset:浏览器可接受的字符集
    • Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间
    • Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到
  3. 空行

    最后一个请求头之后是一个空行,它表示请求头已经结束,接下来的是请求正文。

  4. 请求体

    可以承载多个请求参数的数据。一般用json数据。

1.2.2 响应报文

  1. 响应行

    一般由协议版本、状态码及其描述组成。如:

    HTTP/1.1 200 OK
    

    常见状态码:

    • 100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。
    • 200~299:表示成功接收请求并已完成整个处理过程。常用200
    • 300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),304和307(我不给你这个资源,自己拿缓存)
    • 400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有),403(服务器拒绝访问,权限不够)
    • 500~599:服务器端出现错误,常用500
  2. 响应头

    响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。常见的有:

    • Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。
    • Content-Length:表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream())发送内容。
    • Content-Type:表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置 Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType方法。(重要,后面的编码需要用这个)
    • Location:这个头配合302状态码使用,用于重定向接收者到一个新URI地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
  3. 空行

    最后一个响应头之后是一个空行,它表示请求头已经结束,接下来的是请求正文。

  4. 响应体

    响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码。

1.3 持久连接

HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。以当年的通信情况来说,因为都是些容量很小的文本传输,所以即使这样也没有多大问题。可随着 HTTP 的普及,文档中包含大量图片的情况多了起来。比如,使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销。为解决这个问题,在 HTTP/1.1 中,所有的连接默认都是持久连接,只要任意一端没有明确提出断开连接,则保持TCP连接状态。减轻了服务器的负载,所以web页面显示速度就提高了。

1.4 get请求和post请求的区别

  • GET在浏览器回退时是无影响的,而POST会再次提交请求。
  • GET请求会被浏览器主动缓存,而POST不会。
  • GET 请求保留在浏览器历史记录中, POST 请求不会保留在浏览器历史记录中。
  • GET请求在URL中传送的参数是有长度限制的(在url中),而POST没有限制(在请求体中)。
  • GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

二.用socket实现http协议

目标:java代码运行起来后,在页面上输入localhost:8080/1.jpg,显示一张图片出来。
分析:这个肯定是需要自己创建一个本地服务器,接收客户端的http请求,并作出响应。那么就肯定是需要用socket来实现http协议了吧,下面附上代码。有许多多余的代码,方便大家了解http报文,可以略,有效代码比较少,熟悉http协议的话,很容易就能写出来。

package cn.server;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket
Java Socket 实现HTTPHTTPS协议发送POST/GET请求 阅读详情

相关推荐

使用Java socket 实现 HTTP 协议

突然发现 CSDN 可以使用MarkDown编辑器了,真是一种进步啊!不过貌似出来的太晚了,呵呵。 这篇文章我们讲一下如何使用 简单地Java socket 来实现部分的 HTTP协议。 1. 要实现HTTP协议必须要了解 HTTP协议 HTTP协议是超文本传输协议(Hypertext Transfer Protocol),在OSI七层模型之中属于应用层协议。 在传输层由TCP/I

xiaorenwuzyh的专栏 1651

通过tomcat(http://localhost:8080/)直接访问文件(图片等)

  文章目录向Tomcat添加配置访问直接启动Tomcat通过 IDEA 启动 Tomcat        向Tomcat添加配置 添加配置如下: <Context path="/image" docBase="H:/online/picture" reloadable="true" crossContext="true"></Context> Context标签的属性有: path:指定访问该Web应用的 URL 入口,就是通过 http://lo

qwjy的博客 1万+

Java使用socket通过http下载文件

目录前言socket套接字http协议正文http请求头:向服务器请求文件http请求头:分析服务器回传的头的信息例子:服务器回传的http头部信息:通过http下载文件的几个步骤注意事项:代码执行结果 前言 因为有一门课的实验要用到这个,而老师不让用URL对象,只能用socket,网上关于socket下载的资料少之又少,故总结之 socket套接字 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中

AKGWSB 's blog 2289

JAVA--Socket编程实现HTTP报文收发(模拟浏览器)

每天我们都会使用浏览器去访问一些网站页面,但是每次访问时,你是否会想知道,浏览器和服务器到底做了些什么,才让你看到浏览器呈现给你的这些具有样式排版,乃至动画的页面? 本文需要知识前提:HTTP协议了解,TCP/IP协议了解,Socket编程了解。 1.浏览器收发HTTP报文 你可能会回答,浏览器向服务器端发送HTTP请求,服务器回复HTTP请求,再经过浏览器内核的渲染和javas...

CringKong的博客 1万+

Java Socket手撸了一个HTTP服务器

这一块需要注意一点,正文可能为空,也可能有数据;有数据时,我们要如何把所有的数据都取出来呢?

恒二哥的博客 2028

java socket 实现http_Java Socket实现http协议

HTTP协议报文结构HTTP 协议是应用层协议HTTP协议报文分为请求报文和响应报文两种类型,两者都包含三部分:首行、头部、主体。HTTP 请求报文请求行:GET / HTTP/1.1表示请求的方法(请求类型)、路径、协议版本请求头:Connection: keep-alive请求体:GET的请求体为空HTTP 响应报文响应行:HTTP/1.1 200响应头:content-type: text...

weixin_36315722的博客 1226

java socket实现http请求

1

qq_39561611的博客 550

Java课程设计博客(个人)

Java课程设计博客(个人) 1. 团队课程设计博客链接 http://www.cnblogs.com/wkfg/p/7063081.html 2. 个人负责模块或任务说明 负责模块/任务:解析POST请求的dopost函数,外部调用结构 3. 代码提交记录截图 4. 课程设计感想 虽然说用Socket搭建的服务器很简易,但从这次课设中对HTTP协议有了较好的了解,搭建服务器也可以用tomc...

weixin_30502157的博客 153

Java Socket实现http协议

HTTP协议报文结构 HTTP 协议是应用层协议HTTP协议报文分为请求报文和响应报文两种类型,两者都包含三部分:首行、头部、主体。 HTTP 请求报文 请求行:GET / HTTP/1.1 表示请求的方法(请求类型)、路径、协议版本 请求头:Connection: keep-a...

chengqinyi6228的博客 1594

Android中的TCP/IP协议SocketHttp协议间的关系

前提:本片文章的名字叫做"Android开发中的TCP/IP协议Socket编程",其实TCP/IP协议是一种网络协议,并不是在Android中才有的,也不只是在java中有,其他的开发语言中同样也可以使用TCP/IP协议进行网络编程。之所以这么说是因为在不久的以前,作者也是一个对于各种协议、什么socket编程、什么http等等完全没有概念,直到现在,我也还是在不断的学习,去尝试慢慢的理解它们

u010618194的博客 4837

Java中用Socket类模拟HTTP协议

Http客户端程序已集成在Java语言中,可以通过URLConnection类调用。遗憾的 是,由于SUN没有公布Http客户程序的源码,它实现的细节仍是一个谜。本文根据HTTP协议规范,用Java.net.Socket类实现一个HTTP协议客户端程序。     HTTP协议     HTTP协议同其它TCP/IP协议集中的协议一样,是遵循客户/服务器模型工作的。客户端发往服务

小毅的书屋 3581

通过一个Socket例子理解Http协议

来自:http://tech.163.com/tm/030531/030531_95888.htmlWeb服务器与客户端的通信使用HTTP协议(超文本传输协议),所以也叫做HTTP服务器。用Java构造Web服务器主要用二个类,java.net.Socketjava.net.ServerSocket,来实现HTTP通信。因此,本文首先要讨论的是HTTP协议和这两个类,在此基础上实现一个简单但

autoinspired的专栏 2784

通过一个Socket例子理解Http协议(实战Java Web服务器--使用HTTP协议JAVA类实现)

Web服务器与客户端的通信使用HTTP协议(超文本传输协议),所以也叫做HTTP服务器。用Java构造Web服务器主要用二个类,java.net.Socketjava.net.ServerSocket,来实现HTTP通信。因此,本文首先要讨论的是HTTP协议和这两个类,在此基础上实现一个简单但完整的Web服务器。   一、超文本传输协议   Web服务器和浏览器通过HTTP协议在In

rongwenbin的专栏 7623

Java实现http协议

1.http协议http协议是一种用于在网络设备两端传输超文本的协议    此协议分为客户端和服务端    在详细了解此协议之前,我们要清楚     1.客户端一般是指运行在网络设备上的浏览器     2.服务端是提供内容服务的服务器软件    我们来看一下当客户端向服务端发送的请求报文头    这个是由客户端(浏览器)自动构造发送给服务端的    接下来是服务端向客户端的发送的回应报文头 ...

唐宋元明清的博客 4729

深入剖析Tomcat之HTTP协议Socket编程基础

本文深入探讨了Tomcat中HTTP协议Socket编程的基础知识。首先,HTTP协议是互联网上应用最广泛的网络协议,定义了客户端与服务器之间的数据交换格式。HTTP请求由请求行、请求头和请求实体正文组成,常见的请求方法包括GET和POST。HTTP响应则包含协议、状态码、响应头和响应实体段,常见状态码有200、404和500。其次,Socket编程通过java.net.Socketjava.net.ServerSocket类实现网络通信。客户端使用Socket类连接服务器,服务器端使用ServerSo

wj_rdk的博客 1278

通过Socket实现Http中Get请求

对于网络通信这部分,一直搞不清楚网络模型中传输层协议和应用层协议是怎么进行交互的,于是想通过直接使用TCP协议实现http请求的发送,所以这里通过Socket编程来完成这项工作,在Java中还可以使用原生的HttpURLConnection或者Apache中的HttpClient完成Http请求的发送,但是这种方式已经是对Socket进行封装,对我们理解Http的原理没有帮助。

lmy86263的博客 5226

http详解,用java解析HTTP协议

HTTP协议 包 JAVA解析 一、超文本传输协议HTTP包     HTTP协议用于在Internet上发送和接收消息。HTTP协议是一种请求-应答式的协议——客户端发送一个请求,服务器返回该请求的应答,所有的请求与应答都是HTTP包。HTTP协议使用可靠的TCP连接,默认端口是80。HTTP的第一个版本是HTTP/0.9,后来发展到了HTTP/1.0,现在最新的版本是HTTP/1.1

zs4419的专栏 2171

使用Socket发送HTTP请求

java开发中有不少发送Http请求的需求,比较常见的工具类有HttpURLConnection,HttpClient和Spring中的RestTemplate,这几个类封装程度一个比一个高,越来越方便开发,更符合面向对象的编程思想.但是久而久之,也渐渐地忽略了它们背后的HTTP协议Socket开发....

学习笔记 3731

socket发送Http协议的请求与响应格式解析

一、什么是socket 回答这个问题前我们要先看下TCP/IP四层模型,想必这个图大家都有见过,下面就解释下这四层分别的表现形式是什么(理论解释比较让人摸不着头脑,所以这里以其表现形式来阐述) 1、网络接口层:主要表现为识别mac间比特流的传输 2、网络层:表现为IP协议 3、传输层:表现为TCP、UDP 4、应用层:表现为HttpHttps、RTSP等(这里的协议比较多,我们经常使用的http...

qq_37910618的博客 3315
上一篇: linux下rpm-bundle方式的mysql的安装与配置
下一篇: 缓存一致性问题
chaserFF
博客等级 码龄9年 8粉丝 4原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值