从自己实现简单HTTP服务器中学习HTTP

关于HTTP,从啃完图解HTTP之后,觉得信息量还是有一些的,自然不可能完全都记得清楚,只能记得大概,而自己实现一个似乎能够更好地理解。

本文使用Python,因为原文就是用的Python,也挺好理解的:http://www.codeceo.com/article/make-web-server-1.html

import socket

HOST, PORT = '', 8888

listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print 'Serving HTTP on port %s ...' % PORT
while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(1024)
    print request

    http_response = """\
HTTP/1.1 200 OK

Hello, World!
"""
    client_connection.sendall(http_response)
    client_connection.close()

从表面上来看这段代码非常普通——如果你写过socket通信就会发现这无非是换了传输内容的socket通信模板。

之后我们访问localhost:8888或者127.0.0.1:8888会看到Hello World。

之后我们来用telnet模拟一下浏览器:

telnet localhost 8888

之后的内容如下:

Trying 127.0.0.1 …
Connected to localhost.
GET /hello HTTP/1.1

HTTP/1.1 200 OK
Hello, World!

我们来分一下这一段:

  • GET:HTTP Method
  • /hello:相当于route(叫做Path)
  • HTTP/1.1:HTTP Version

之后返回:

  • HTTP版本 状态码
  • 主体

每一个HTTP请求和响应都满足这个条件,甚至我们可以nc baidu.com 80测试:

GET / HTTP/1.1
HOST: www.baidu.com
Connection: close

HTTP/1.1 200 OK
Date: Wed, 08 Jun 2016 07:25:27 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Thu, 09 Jun 2016 07:25:27 GMT
Connection: Close
Content-Type: text/html

<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
web服务器创建一个监听socket持续地接受新的连接。客户端发起一个TCP连接,然后成功建立连接,客户端发出一个HTTP请求给服务器,服务器用HTTP响应来做回复,最后呈现给用户。建立TCP连接的过程中客户端和服务器都使用了 socket。

换句话说,只要满足HTTP标准格式的都能被浏览器解析为HTTP协议,那么通过这个方法,我们似乎也可以自建基于TCP的任何协议,只要自己写解析器和使用规则即可,通过Path的匹配来决定显示。

说了那么多,总结起来就是HTTP就是特定规则的TCP应用(当然,这里省略了很多实现细节,所以是最简单的,不可用作公用的)。

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 知识, 代码段

已有 5 条评论

  1. prettify.js~

  2. wrz

    这也叫做http server…

    1. 这就已经是一个雏形了啊 如果有兴趣造轮子可以自己补完

    2. 不过我觉得没什么特别大的意思,重要的还是搞清楚 HTTP 协议的工作原理吧

  3. dawn

    支持一下

添加新评论