本文主要介绍go语言基于tcp协议实现一个简单的http服务器。可以学到:1.如何实现一个简单的http服务器2.通过错误的http协议格式加深对http协议的理解。我们平时使用的http服务器,比如apache、nginx,都是功能齐全、功能强大的服务器。如果不看源码,是无法很好的理解http服务器的内部实现的。如果我们不自己实现一个简单的http服务器,我们可能无法很好的理解http协议。我们不仅应该知道它是什么,还应该知道它为什么会这样。本文从tcp协议的介绍开始,然后按照http协议格式使用tcpsocket向客户端发送数据。这里的客户端指的是浏览器。传输控制协议(TCP,TransmissionControlProtocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。tcp协议属于传输层协议,http协议属于应用层协议,http协议位于tcp协议之上,http协议是基于tcp协议实现的。很多应用层协议都是基于tcp协议实现的,比如:文件传输协议ftp、ssh协议、telenet协议等。下面开始我们的编程之旅吧!先监听本地tcp端口8888listen,err:=net.Listen("tcp","127.0.0.1:8888")然后打印监听信息fmt.Println("serverstartlisteningonport8888")然后延时关闭tcp流deferlisten.Close()然后进入for循环监听。如果有连接,则启动goroutine进行处理。然后我们看一下handleClient函数的实现。gohandleClient函数首先定义响应体并打印响应体长度。然后定义响应头,以“HTTP/1.1200OK\n”开头,这是http协议的标准响应头,然后定义响应类型和响应体的长度。响应头和响应体之间用“\n\r\n”分隔。最后以字节格式发送给浏览器。下面我们来看看执行效果吧!在浏览器中输入http://127.0.0.1:8888/,就可以在浏览器中看到我们启动的服务器返回的数据。ResponseHeaders中的响应头正是我们设置的。恭喜,你已经完成了自己的http服务器!但凡事都要举一反三。让我们再试一次。如果http状态为500,返回的结果是什么?http浏览器的http500是我们在开发中经常遇到的。现在我们自己模拟了。我们可以尝试去掉响应头和响应体之间的分隔符http。让我们看看结果。浏览器的结果是浏览器无法识别。这就是为什么要有http协议的原因。首先,规定了协议。每个浏览器都按照协议来实现协议,这样就不会出现问题。
