SimpleHTTPServer是python自带的一个简单的静态HTTP服务器, python2.x下只要切换到想要共享的目录简单地输入下面的命令,就可以打开该HTTP服务器:
python -m SimpleHTTPServer [port]
其中,port是可选参数,用于指定使用的端口,默认使用的是8000端口。
在python3.x中,SimpleHTTPServer模块被合并进了http.server模块中,所以,python3.x中命令略有不同:
python3 -m http.server [port]
打开服务器之后,只需在任何局域网设备浏览器中输入服务器ip:port就可以查看和下载服务器指定目录的文件。如下图所示:
图1. 浏览器展示的文件目录
这个文件服务器虽然简单,但却能充分利用局域网的带宽,为公司、家庭和学校等场景省去了U盘拷贝文件的烦恼。
当然,正由于简单它同样存在着很多缺陷,很重要的一点就是其不支持并发, 即不能同时有多个主机访问共享的目录。为了解决这个问题,重写这个模块:
python2.x:
#!/usr/bin python# encoding: utf-8import socketimport BaseHTTPServerfrom SimpleHTTPServer import SimpleHTTPRequestHandler as SHRHfrom SocketServer import ForkingTCPServer as FTSclass ForkingHTTPServer(FTS): passdef main(ServerHandlers = SHRH, ServerClass = ForkingHTTPServer): BaseHTTPServer.test(ServerHandlers, ServerClass)if __name__ == '__main__': print("Host_address:[%s]" % socket.gethostbyname(socket.gethostname())) main()
python3.x
#!/usr/local/bin python3# encoding: utf-8import socketfrom socketserver import ForkingTCPServer as FTSimport http.serverfrom http.server import SimpleHTTPRequestHandler as SHRHclass ForkHTTPServer(FTS): passdef test(ServerHandler=SHRH, ServerClass=ForkHTTPServer): http.server.test(ServerHandler, ServerClass)if __name__ == '__main__': ip_address = socket.gethostbyname(socket.gethostname()) print("Server address:[%s]" % ip_address) test()
上面的代码中ServerClass继承自ForkingTCPServer类,这个类是socketserver模块中ForkingMixIn和TCPServer的综合,前者实现了使用分支的方法实现了HTTP服务器的并发功能。
将代码保存为ForkHTTPServer.py, 然后将其移动至python的库目录下(我的python2.7为/usr/lib/python2.7;python3.4为/Library/Frameworks/Python.framework/Versions/3.4/lib),使用如下命令就可以启动并发版的简易静态文件服务器了:)
[python2.7]
python -m ForkHTTPServer [port]
[python3.4]
python3 -m ForkHTTPServer [port]
这个命令还是太麻烦,对于Linux或Mac用户可以更进一步,为该命令取别名:
vim ~/.bashrc
添加:
[python2.7]
alias share="python -m /usr/lib/python2.7/ForkStaticServer"
[python3.4]
alias share="python3 -m /Library/Frameworks/Python.framework/Versions/3.4/lib/ForkStaticServer"
这样,只要在终端中输入“share”命令就可以开去文件服务器了,很方便是吧:-D