|
|
51CTO旗下网站
|
|
移动端

Tcp协议实现HTTP服务器,带你理解HTTP协议

本篇文章从tcp协议开始介绍,之后使用tcp socket按照http协议格式发送数据到客户端,这里的客户端指的就是浏览器。

作者:黑客之家来源:今日头条|2020-06-17 21:39

本篇文章主要介绍go语言基于tcp协议实现简单的http服务器,大家可以学习到:

1.怎样实现一个简单的http服务器

2.通过错误的http协议格式加深对http协议的理解

平时我们使用的http服务器,如:apache、nginx都是一个完整而且功能强大的服务器,如果我们不去看源码无法很好地理解http服务器的内部实现。如果我们不去自己实现一个简单的http服务器,可能就无法很好地理解http协议,我们学习应该不仅要知其然还要知其所以然。

本篇文章从tcp协议开始介绍,之后使用tcp socket按照http协议格式发送数据到客户端,这里的客户端指的就是浏览器。

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

tcp协议属于传输层协议,http协议属于应用层协议,http协议位于tcp协议之上,也是http协议是基于tcp协议实现的。很多应用层协议都是基于tcp协议实现的,如:文件传输协议ftp、ssh协议、telenet协议等。

下面开始我们的编程之旅!

首先监听本地tcp 8888端口

listen, err := net.Listen("tcp", "127.0.0.1:8888")

之后打印监听信息

fmt.Println("server start listening on port 8888")

接着延时关闭tcp流

defer listen.Close()

之后for循环进入监听,如果有连接进来启动goroutine进行处理

go语言基于tcp协议实现http服务器,带你理解http协议

go

接着我们来看下handleClient函数的实现

go语言基于tcp协议实现http服务器,带你理解http协议

go

handleClient函数里面首先定义了响应体,打印响应体的长度。之后定义响应头,响应头以“HTTP/1.1 200 OK\n”开始,这是http协议的标准响应头,之后定义响应类型和响应体的长度。响应头和响应体之间以“\n\r\n”分割。

最后以字节格式发送给浏览器。

下面我们来看下执行效果吧!在浏览器中输入

  1. http://127.0.0.1:8888/ 
go语言基于tcp协议实现http服务器,带你理解http协议

浏览器

可以看到浏览器中显示出我们启动的服务器返回的数据。Response Headers中的响应头正是我们设置的。

恭喜你,完成了自己的http服务器!

但是凡事我们要举一反三,我们再来试一下如果http状态是500时,返回的结果是什么?

go语言基于tcp协议实现http服务器,带你理解http协议

http

go语言基于tcp协议实现http服务器,带你理解http协议

浏览器

这个http 500就是我们在开发中经常遇到的,现在我们自己模拟实现了。

我们可以尝试去掉响应头和响应体之间的分隔符

go语言基于tcp协议实现http服务器,带你理解http协议

http

我们看下结果

go语言基于tcp协议实现http服务器,带你理解http协议

浏览器

结果是浏览器无法识别,这就是为什么会有http协议,先规定协议各家浏览器按照协议实现,这样就不会出现问题。

【编辑推荐】

  1. 担忧“电磁干扰”成隐形杀手? 宁畅工程师一招守护服务器稳定
  2. 如何为小型企业选购优秀服务器硬件
  3. 单台服务器并发能力如何最大调优?
  4. 跟踪服务器功耗的工具和技巧
  5. Xilinx 推出实时服务器一体机:助力高品质低成本视频直播
【责任编辑:武晓燕 TEL:(010)68476606】


点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

实操案例:Jenkins持续交付和持续部署

实操案例:Jenkins持续交付和持续部署

微服务架构下的自动化部署
共18章 | freshman411

167人订阅学习

思科交换网络安全指南

思科交换网络安全指南

安全才能无忧
共5章 | 思科小牛

101人订阅学习

云计算从入门到上瘾

云计算从入门到上瘾

传统IT工程师的转型
共26章 | 51CTO阿森

256人订阅学习

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微