从自己实现简单HTTP服务器中学习HTTP
关于HTTP,从啃完图解HTTP之后,觉得信息量还是有一些的,自然不可能完全都记得清楚,只能记得大概,而自己实现一个似乎能够更好地理解。
本文使用Python,因为原文就是用的Python,也挺好理解的:http://www.codeceo.com/article/make-web-server-1.html
1import socket
2
3HOST, PORT = '', 8888
4
5listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
6listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
7listen_socket.bind((HOST, PORT))
8listen_socket.listen(1)
9print 'Serving HTTP on port %s ...' % PORT
10while True:
11 client_connection, client_address = listen_socket.accept()
12 request = client_connection.recv(1024)
13 print request
14
15 http_response = """\
16HTTP/1.1 200 OK
17
18Hello, World!
19"""
20 client_connection.sendall(http_response)
21 client_connection.close()
22
从表面上来看这段代码非常普通——如果你写过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应用(当然,这里省略了很多实现细节,所以是最简单的,不可用作公用的)。
评论 (3)
支持一下
这也叫做http server…
这就已经是一个雏形了啊 如果有兴趣造轮子可以自己补完
不过我觉得没什么特别大的意思,重要的还是搞清楚 HTTP 协议的工作原理吧
prettify.js~