一直比较想写TCP与HTTP之间的关系,HTTP报文是如何通过tcp发送的,HTTP报文形式内容如何。

HTTP请求包含请求行,请求头,请求体

HTTP响应包含响应头,响应头,响应体

下面我准备通过JAVA自带的socket创建一个HTTP服务,这样就可以直到HTTP整个内容了。

  1. public static void main(String[] args) throws Exception {
  2. ServerSocket ss = null;
  3. Socket socket = null;
  4. BufferedReader br = null;
  5. BufferedWriter bw = null;
  6. try {
  7. //1.创建socket连接
  8. ss = new ServerSocket(8081);
  9. //循环等待
  10. while (true) {
  11. //2.堵塞,直到有新的连接进来
  12. socket = ss.accept();
  13. //3.设置读写缓冲区
  14. br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  15. bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
  16. String s;
  17. int contentLength = 0;
  18. //4.输出请求体中的内容,并且将Content-Length的值赋值给contentLength,确定post请求体的大小
  19. while ((s = br.readLine()) != null && !s.isEmpty()) {
  20. System.out.println(s);
  21. if (s.indexOf("Content-Length") != -1) {
  22. contentLength = Integer.parseInt(s.substring(s.indexOf("Content-Length") + 16));
  23. }
  24. }
  25. //5.如果有请求体,通过read方法读取请求体中的内容
  26. if (contentLength != 0) {
  27. char[] buf = null;
  28. if (contentLength != 0) {
  29. buf = new char[contentLength];
  30. br.read(buf, 0, contentLength);
  31. System.out.println("The data user posted: " + new String(buf));
  32. }
  33. }
  34. //6 设置响应体内容
  35. bw.write("HTTP/1.1 200 OK\n");
  36. bw.write("Content-Type: text/html; charset=UTF-8\n\n");
  37. bw.write("<html>\n" +
  38. "<head>\n" +
  39. " <title>first page</title>\n" +
  40. "</head>\n" +
  41. "<body>\n" +
  42. " <h1>Hello World!" + "</h1>\n" +
  43. "</body>\n" +
  44. "</html>\n");
  45. //7.冲刷到浏览器,即使关闭资源,不然可能导致浏览器一直等待服务器数据
  46. bw.flush();
  47. bw.close();
  48. br.close();
  49. socket.close();
  50. }
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. } finally {
  54. //关闭资源
  55.  
  56. ss.close();
  57. }
  58. }

首先我在浏览器中输入http://localhost:8081/?username=tt 网址(使用不同的浏览器请求报文可能有些差异,比如你安装的某些插件
导致插件也会向服务器发出请求),下面来看看这个在服务器接收到的是什么内容

  1. //首先是请求行,包含请求方式,相对路径,HTTP协议,占一行(也就是说后面接上了\n)
  2. GET /?username=tt HTTP/1.1
  3. //之后就是请求体,主要包括Accept,Accept-Language,User-Agent,Accept-Encoding,Host,Connection,每一个都独占一行
  4. Accept: text/html, application/xhtml+xml, image/jxr, */*
  5. Accept-Language: zh-CN
  6. 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
  7. Accept-Encoding: gzip, deflate
  8. Host: localhost:8081
  9. Connection: Keep-Alive
  10. //由于GET没有请求体,所以不会出现请求体内容,如果是post请求则会有请求体内容

之后再来看看响应体写法

  1. //1.设置响应体 包含HTTP协议版本,状态码, 状态码说明
  2. bw.write("HTTP/1.1 200 OK\n");
  3. //2.设置响应头,主要是相应提编码以及MIME类型方便浏览器解析
  4. bw.write("Content-Type: text/html; charset=UTF-8\n\n");
  5. //3.设置响应体,与HTML类似
  6. bw.write("<html>\n" +
  7. "<head>\n" +
  8. " <title>first page</title>\n" +
  9. "</head>\n" +
  10. "<body>\n" +
  11. " <h1>Hello World!"+"</h1>\n" +
  12. "</body>\n" +
  13. "</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. 日推20单词 Day01

    1.conflict n. 冲突 2.electronic adj. 电子的 3.mine n. 矿藏,地雷 4.mineral n. 矿物质 adj. 矿物的 5.undermine vt 破坏,渐 ...

  2. 如何把百度统计代码放入JS文件中?百度统计的JS脚本原理分析

    <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script&quo ...

  3. SpringMVC(十):SpringMVC 处理输出模型数据之Map及Model

    Spring MVC提供了以下几种途径输出模型数据: 1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据: 2)Map及Model:处理方法 ...

  4. POJ-1860 Currency Exchange---Bellman-Ford判断正环

    题目链接: https://vjudge.net/problem/POJ-1860 题目大意: 我们的城市有几个货币兑换点.让我们假设每一个点都只能兑换专门的两种货币.可以有几个点,专门从事相同货币兑 ...

  5. Spring(2)——Spring IoC 详解

    Spring IoC 概述 IoC:Inverse of Control(控制反转) 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控 ...

  6. CentOS 7 安装Boost 1.61

    1. 到官网下载最新版的boost,http://www.boost.org/users/history/version_1_61_0.html 2. 解压: tar zxvf boost_1_61_ ...

  7. iframe 里的高度自适应

    由于公司里的很多东西都要用到iframe 导致我不得不各种百度 首先是自适应高度 // document.domain = "caibaojian.com"; function s ...

  8. Sevrlet 工作原理解析-转

    从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力 ...

  9. [LeetCode] Minimum Time Difference 最短时间差

    Given a list of 24-hour clock time points in "Hour:Minutes" format, find the minimum minut ...

  10. git中的merge与rebase

    之前一直对git的merge与rebase很困惑,而且一般也只使用merge而不是使用rebase.今天受高人指点理清了两者的区别. 首先对于两者而言,他们的结果是一样的,差异在于合并的方式(产生的结 ...