python 自带的SimpleHTTPServer 模块可迅速搭建一个httpserver。
进入某个目录里
python -m SimpleHTTPServer #python2
python -m http.server #python3
源码结构:
模块结构
SimpleHTTPServer.py #get head 以及文件目录的实现
BaseHTTPServer.py #http的实现
SocketServer.py #socket的实现
SimpleHTTPServer
#伪码
class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self): #HTTP get的实现
f = self.send_head()
if f:
self.copyfile(f, self.wfile) #显示文件(文件列表也是写到临时文件返回)
def do_HEAD(self): #HTTP head的实现
f = self.send_head()
if f:
f.close()
def send_head(self):
if {path is dir}:
return 文件列表页
else:
return 文件
BaseHTTPServer
class HTTPServer(SocketServer.ForkingTCPServer):
def server_bind(self): #复写用于保存server name 和port
...
host, port = self.socket.getsockname()[:2]
self.server_name = socket.getfqdn(host)
self.server_port = port
class BaseHTTPRequestHandler(SocketServer.StreamRequestHandler):
def handle(self):#解析到command, path, version
self.handle_one_request()
def send_error(self, code, message=None):#返回错误
self.send_header
self.wfile.write(content)
def send_response(self, code, message=None):#返回数据
return content
SocketServer
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
常见的server 模式
- synchronous (one request is handled at a time)
- forking (each request is handled by a new process)
- threading (each request is handled by a new thread)
select、poll、epoll区别
| 区别项 | select | poll | epoll |
|---|---|---|---|
| 单个进程最大连接数 | 2048 | 无限制 | 无限制 |
| FD剧增后的效率 | 线性性能下降 | 线性性能下降 | 无线性性能下降 |
| 消息传递 | 内核拷贝 | 内核拷贝 | 共享内存 |
SimpleHTTPServer 用的是select,也可以改成另外两种体验一下








网友评论