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协议提供的无连接 ...
 
随机推荐
- Python/模块与包之模块
			
Python/模块与包之模块 1.什么是模块? 模块就是py文件 2.为什么要用模块? 如果在解释器上进行编码,把解释器关闭之前写的文件就不存在了,如果使用模块的话就能永久保存在磁盘中. 3.如何使用 ...
 - Docker学习(1)安装
			
1. Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱 ...
 - Java:日期类Date与Calendar
			
Timestamp类型与日期类型之间的转化? Timestamp timestamp = Timestamp.valueOf("2017-03-17 07:00:00"); Dat ...
 - 如何从二维数组中的多个key中获取指定key的值?
			
精华 LOVEME96 2016-10-21 10:40:19 浏览(1512) 回答(3) 赞(0) 新手求教:二维数组中一般会有多个key,如果我们要获得指定key的值,应该怎么做? 问题标签: ...
 - 在windows系统之中查看目前已安装的更新
			
方法1:使用PowerShell get-hotfix 方法2:使用cmd systeminfo.exe 参考链接
 - C#利用微软企业库Enterprise Library配置mysql数据库
			
在C#项目中,很多时候到要用到Enterprise Library.这里只是用一个很简单的小例子来演示一下Enterprise Library在VS2010中操作MySQL数据库的流程. 1,利用En ...
 - 机器学习技法:02 Dual Support Vector Machine
			
Roadmap Motivation of Dual SVM Lagrange Dual SVM Solving Dual SVM Messages behind Dual SVM Summary
 - PHPCMS v9.6.0 任意用户密码重置
			
参考来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0173130.html 他分析的好像不对.我用我的在分析一次. 先来看poc: /inde ...
 - [HNOI 2017]单旋
			
Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的 ...
 - [NOIp 2017]宝藏
			
Description 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋 ...