莫忘少年凌云志
曾许天下第一流

多线程版SimpleHTTPServer

最近有个小项目需要在内网起一个http服务,给内网的其他机器分发内容。临时用一下的,而且内网搞nginx,或者caddy之类的都比较麻烦,caddy好像自动要去申请证书,怎么都搞不好。我只需要单纯的起个http服务让内网其他机器来wget就好了。查了一下python自带的SimpleHTTPServer就挺方便的一句话就能起服务。试了一下确实比较好用,但是有个比较明显的缺点就是单线程的,当内网有多个机器需要获取内容的时候,只能一个个排队来下载,这样效率比较低。查了一下网络上也有别人有搞过多线程,汇集了一下资源。放代码:

import socket
import SocketServer
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler


class ForkingHTTPServer(SocketServer.ForkingTCPServer):

    allow_reuse_address = 1

    def server_bind(self):
        """Override server_bind to store the server name."""
        SocketServer.TCPServer.server_bind(self)
        host, port = self.socket.getsockname()[:2]
        self.server_name = socket.getfqdn(host)
        self.server_port = port


def test(HandlerClass=SimpleHTTPRequestHandler,
    ServerClass=ForkingHTTPServer):
    BaseHTTPServer.test(HandlerClass, ServerClass)


if __name__ == '__main__':
    test()

把上面的代码命名成MultithreadHTTPServer.py

如果不需要全局跑,假设上面这个文件放在/root下就运行

python -m /root/MultithreadHTTPServer 9000

这样就会在ip:9000起一个http服务直接访问http://ip:9000 就好了。

如果想要和原生的SimpleHTTPServer一样不用带目录就能跑的话。需要把MultithreadHTTPServer.py放到pip的安装目录下,可以先用以下命令查找pip安装目录

python -c "import SimpleHTTPServer;help(SimpleHTTPServer)"

会显示:

NAME
    SimpleHTTPServer - Simple HTTP Server.

FILE
    /usr/lib64/python2.7/SimpleHTTPServer.py

这个FILE就是目录了,我这边是/usr/lib64/python2.7/

所以把MultithreadHTTPServer.py丢进去,之后运行就不需要带上目录了,如下:

python -m MultithreadHTTPServer 9000

最后试了一下多个ip可以同时来拖文件了,不错。

赞(1) 打赏
未经允许不得转载:面条的小博客 » 多线程版SimpleHTTPServer
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏