简单多线程HTTP Server的实现(Python)

Posted by ryc111 on April 2, 2016

Python 里面有个SimpleHTTPServer,可以非常方便的将一个目录作为一个http服务器:

python -m SimpleHTTPServer

你自己在浏览器输入: http://0.0.0.0:8000 别人在浏览器里面输入你的ip http://ip:8000 就可以很简单地访问了: 如果你的目录下面只是一些简单的文件,那么,这个就会变成一个简单的文件服务器: DIR_LIST 所以这个可以非常方便地用来共享文件。但是这个只是一个单向的过程,如果需要一个带上传功能的网页,该如何实现? 网上看了看,发现个现成的: http://bones7456.googlecode.com/svn/trunk/SimpleHTTPServerWithUpload.py 主要通过重写BaseHTTPRequestHandler下的do_POST来实现上传功能,运行程序: DIR_LIST_WITH_UPLOAD 所以,这个网页就可以实现上传功能了!看上去很棒耶。但是!当尝试正在传文件的时候,又打开一个新页面,发现页面一直无法加载出来,难道是服务器崩了?仔细看了看代码,才发现这个实现是单线程的,也就是说只要有人在占用这个线程,那么那时候其他人就连网页也无法打开了。这怎么可以呢,一点都不理想啊。所以,似乎加上多线程就好了。 首先: from SocketServer import ThreadingMixIn 然后用这个mix-in来构建多线程版本的HttpServer

class ThreadingHTTPServer(ThreadingMixIn, BaseHTTPServer.HTTPServer):
    pass

接着构建server,在每次有人访问的时候都调用 get_server:

def get_server(port=8000, next_attempts=0, serve_path=None):
    Handler = SimpleHTTPRequestHandler
    if serve_path:
        Handler.serve_path = serve_path
    while next_attempts >= 0:
        try:
            httpd = ThreadingHTTPServer(("", port), Handler)
            return httpd
        except socket.error as e:
            if e.errno == errno.EADDRINUSE:
                next_attempts -= 1
                port += 1
            else:
                raise