HTTP与TCP的关系
一直比较想写TCP与HTTP之间的关系,HTTP报文是如何通过tcp发送的,HTTP报文形式内容如何。
HTTP请求包含请求行,请求头,请求体
HTTP响应包含响应头,响应头,响应体
下面我准备通过JAVA自带的socket创建一个HTTP服务,这样就可以直到HTTP整个内容了。
- public static void main(String[] args) throws Exception {
- ServerSocket ss = null;
- Socket socket = null;
- BufferedReader br = null;
- BufferedWriter bw = null;
- try {
- //1.创建socket连接
- ss = new ServerSocket(8081);
- //循环等待
- while (true) {
- //2.堵塞,直到有新的连接进来
- socket = ss.accept();
- //3.设置读写缓冲区
- br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
- bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
- String s;
- int contentLength = 0;
- //4.输出请求体中的内容,并且将Content-Length的值赋值给contentLength,确定post请求体的大小
- while ((s = br.readLine()) != null && !s.isEmpty()) {
- System.out.println(s);
- if (s.indexOf("Content-Length") != -1) {
- contentLength = Integer.parseInt(s.substring(s.indexOf("Content-Length") + 16));
- }
- }
- //5.如果有请求体,通过read方法读取请求体中的内容
- if (contentLength != 0) {
- char[] buf = null;
- if (contentLength != 0) {
- buf = new char[contentLength];
- br.read(buf, 0, contentLength);
- System.out.println("The data user posted: " + new String(buf));
- }
- }
- //6 设置响应体内容
- bw.write("HTTP/1.1 200 OK\n");
- bw.write("Content-Type: text/html; charset=UTF-8\n\n");
- bw.write("<html>\n" +
- "<head>\n" +
- " <title>first page</title>\n" +
- "</head>\n" +
- "<body>\n" +
- " <h1>Hello World!" + "</h1>\n" +
- "</body>\n" +
- "</html>\n");
- //7.冲刷到浏览器,即使关闭资源,不然可能导致浏览器一直等待服务器数据
- bw.flush();
- bw.close();
- br.close();
- socket.close();
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- //关闭资源
- ss.close();
- }
- }
首先我在浏览器中输入http://localhost:8081/?username=tt 网址(使用不同的浏览器请求报文可能有些差异,比如你安装的某些插件
导致插件也会向服务器发出请求),下面来看看这个在服务器接收到的是什么内容
- //首先是请求行,包含请求方式,相对路径,HTTP协议,占一行(也就是说后面接上了\n)
- GET /?username=tt HTTP/1.1
- //之后就是请求体,主要包括Accept,Accept-Language,User-Agent,Accept-Encoding,Host,Connection,每一个都独占一行
- Accept: text/html, application/xhtml+xml, image/jxr, */*
- Accept-Language: zh-CN
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299
- Accept-Encoding: gzip, deflate
- Host: localhost:8081
- Connection: Keep-Alive
- //由于GET没有请求体,所以不会出现请求体内容,如果是post请求则会有请求体内容
之后再来看看响应体写法
- //1.设置响应体 包含HTTP协议版本,状态码, 状态码说明
- bw.write("HTTP/1.1 200 OK\n");
- //2.设置响应头,主要是相应提编码以及MIME类型方便浏览器解析
- bw.write("Content-Type: text/html; charset=UTF-8\n\n");
- //3.设置响应体,与HTML类似
- bw.write("<html>\n" +
- "<head>\n" +
- " <title>first page</title>\n" +
- "</head>\n" +
- "<body>\n" +
- " <h1>Hello World!"+"</h1>\n" +
- "</body>\n" +
- "</html>\n");
HTTP与TCP的关系的更多相关文章
- Http 和TCP的关系,TCP长连接和短连接有什么区别?
HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.由于HTTP在 ...
- 在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统? 网络层协议 MAC帧、IP数据报、TCP报文 关系 IP地址与硬件地址 链路层与网络层
小结: 1. 网络层两种服务 虚电路服务 virtual circuit 电信网 网络层负责可靠交付 数据报服务 网络层不负责可靠交付 提供灵活的.无连接的.尽最大努力交付的数据报服务 不提供服务 ...
- TCP/IP协议(二)tcp/ip基础知识
今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...
- 二、tcp/ip基础知识
一.TCP/IP的标准化 1.TCP/IP的含义 一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称. 具体点,IP或ICMP.TCP或UDP.TELENT或FTP.以及HTTP等都属 ...
- http协议tcp协议ip协议三次握手四次挥手,为什么三次握手,为什么四次挥手,sockete套接字理解
1.1 TCP是什么? TCP是Tranfer Control Protocol的简称,TCP协议是一种面向连接的.可靠的.基于字节流的运输层通信协议.通过TCP协议传输,得到的是一个顺序的无差错的数 ...
- [手把手教你] 用Swoft 搭建微服务(TCP RPC)
序言 Swoft Framework 基于 Swoole 原生协程的新时代 PHP 全栈式协程框架 Swoft 是什么? Swoft 框架是首个基于Swoole 原生协程的新时代 PHP高性能协程全栈 ...
- TCP/IP协议<二>
一.TCP/IP的标准化 1.TCP/IP的含义 一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称. 具体点,IP或ICMP.TCP或UDP.TELENT或FTP.以及HTTP等都属 ...
- TCP/IP超详细总结
网络的基础知识 一.协议 1.简介: 在计算机网络与信息通信领域里,人们经常提及“协议”一词.互联网中常用的具有代表性的协议有IP.TCP.HTTP等.而LAN(局域网)中常用的协议有IPX/SPX” ...
- 【转载】TCP演进简述
TCP演进简述 http://www.cnblogs.com/fll/ 一.互联网概述 TCP,即传输控制协议,是目前网络上使用的最多的传输协议,我们知道,整个互联网的体系结构是以IP协议提供的无连接 ...
随机推荐
- 日推20单词 Day01
1.conflict n. 冲突 2.electronic adj. 电子的 3.mine n. 矿藏,地雷 4.mineral n. 矿物质 adj. 矿物的 5.undermine vt 破坏,渐 ...
- 如何把百度统计代码放入JS文件中?百度统计的JS脚本原理分析
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script&quo ...
- SpringMVC(十):SpringMVC 处理输出模型数据之Map及Model
Spring MVC提供了以下几种途径输出模型数据: 1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据: 2)Map及Model:处理方法 ...
- POJ-1860 Currency Exchange---Bellman-Ford判断正环
题目链接: https://vjudge.net/problem/POJ-1860 题目大意: 我们的城市有几个货币兑换点.让我们假设每一个点都只能兑换专门的两种货币.可以有几个点,专门从事相同货币兑 ...
- Spring(2)——Spring IoC 详解
Spring IoC 概述 IoC:Inverse of Control(控制反转) 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控 ...
- CentOS 7 安装Boost 1.61
1. 到官网下载最新版的boost,http://www.boost.org/users/history/version_1_61_0.html 2. 解压: tar zxvf boost_1_61_ ...
- iframe 里的高度自适应
由于公司里的很多东西都要用到iframe 导致我不得不各种百度 首先是自适应高度 // document.domain = "caibaojian.com"; function s ...
- Sevrlet 工作原理解析-转
从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力 ...
- [LeetCode] Minimum Time Difference 最短时间差
Given a list of 24-hour clock time points in "Hour:Minutes" format, find the minimum minut ...
- git中的merge与rebase
之前一直对git的merge与rebase很困惑,而且一般也只使用merge而不是使用rebase.今天受高人指点理清了两者的区别. 首先对于两者而言,他们的结果是一样的,差异在于合并的方式(产生的结 ...