一直比较想写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的关系的更多相关文章

  1. Http 和TCP的关系,TCP长连接和短连接有什么区别?

    HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.由于HTTP在 ...

  2. 在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统? 网络层协议 MAC帧、IP数据报、TCP报文 关系 IP地址与硬件地址 链路层与网络层

    小结: 1. 网络层两种服务 虚电路服务 virtual circuit  电信网 网络层负责可靠交付 数据报服务  网络层不负责可靠交付 提供灵活的.无连接的.尽最大努力交付的数据报服务 不提供服务 ...

  3. TCP/IP协议(二)tcp/ip基础知识

    今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...

  4. 二、tcp/ip基础知识

    一.TCP/IP的标准化 1.TCP/IP的含义 一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称. 具体点,IP或ICMP.TCP或UDP.TELENT或FTP.以及HTTP等都属 ...

  5. http协议tcp协议ip协议三次握手四次挥手,为什么三次握手,为什么四次挥手,sockete套接字理解

    1.1 TCP是什么? TCP是Tranfer Control Protocol的简称,TCP协议是一种面向连接的.可靠的.基于字节流的运输层通信协议.通过TCP协议传输,得到的是一个顺序的无差错的数 ...

  6. [手把手教你] 用Swoft 搭建微服务(TCP RPC)

    序言 Swoft Framework 基于 Swoole 原生协程的新时代 PHP 全栈式协程框架 Swoft 是什么? Swoft 框架是首个基于Swoole 原生协程的新时代 PHP高性能协程全栈 ...

  7. TCP/IP协议<二>

    一.TCP/IP的标准化 1.TCP/IP的含义 一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称. 具体点,IP或ICMP.TCP或UDP.TELENT或FTP.以及HTTP等都属 ...

  8. TCP/IP超详细总结

    网络的基础知识 一.协议 1.简介: 在计算机网络与信息通信领域里,人们经常提及“协议”一词.互联网中常用的具有代表性的协议有IP.TCP.HTTP等.而LAN(局域网)中常用的协议有IPX/SPX” ...

  9. 【转载】TCP演进简述

    TCP演进简述 http://www.cnblogs.com/fll/ 一.互联网概述 TCP,即传输控制协议,是目前网络上使用的最多的传输协议,我们知道,整个互联网的体系结构是以IP协议提供的无连接 ...

随机推荐

  1. Django中ORM介绍和字段及其参数

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  2. 关于ZK框架的onScroll事件的问题

    由于我现在所在的公司用到的zk框架,遇到了一个需求frozen on top. 简单来说就是滚动超过范围后,希望有一块东西停留在滚动窗口的顶部. 一.zk框架 查看了zk的8.x版本,发现组件的支持的 ...

  3. JavaScript(js)/上

    JavaScript(js) ECMA-----定义的基础语法 DOM------document  object  model BOM------Browser  object  model Jav ...

  4. Python第三方库的安装方法总结

    源码安装 很多第三方库都是开源的,几乎都可以在github 或者 pypi上找到源码.找到源码格式大概都是 zip . tar.zip. tar.bz2格式的压缩包.解压这些包,进入解压好的文件夹,通 ...

  5. Django通过pycharm创建后,如何登录admin后台?

    问题背景: 使用pycharm创建完成django项目(项目名称为:mydjangopro,app名称为my_blog) , 本想登录后台直接输入地址:http://127.0.0.1:8000/ad ...

  6. 给定了经纬度的一张my_latlng表,和一个my_grid表,怎么实现my_latlng表回mygrid中的id?

    场景: 假设我们拥有一个拥有了一系列经纬度的表my_latlng(lat string,lng string)表,还有一张给定的栅格表my_grid(gridid bigint,centerlng d ...

  7. 数据库性能优化(database tuning)性能优化绝不仅仅只是索引

    一毕业就接触优化方面的问题,专业做优化也有至少5年之多的时间了,可现在还是经常听到很多人认为优化很简单,就是建索引的问题,这确实不能怪大家,做这行20多年的时间里,在职业生涯的每个阶段,几乎都能听到这 ...

  8. JS基本数据类型(typeof的返回结果)

    number(Infinity/NaN) string boolean function object(null.各种值装箱对象.内置对象.自定义对象) undefined 判断对象是否为某个[类/构 ...

  9. 实验吧_Guess Next Session&Once More(代码审计)

    Guess Next Session 看题目提示,是一道代码审计: <?php session_start(); if (isset ($_GET['password'])) { if ($_G ...

  10. [SDOI 2013]方程

    Description 题库链接 求不定方程 \(x_1+x_2+\cdots +x_n=m\) 的正整数解的个数,并且要求满足限定: \(\forall i\in[1,n_1] x_i\leq a_ ...