改进的一行Python实现文件共享--支持并发


  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-8

import socket
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler as SHRH
from SocketServer import ForkingTCPServer as FTS

class ForkingHTTPServer(FTS):
    pass

def 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-8

import socket
from socketserver import ForkingTCPServer as FTS
import http.server
from http.server import SimpleHTTPRequestHandler as SHRH

class ForkHTTPServer(FTS):
    pass

def 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

 

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告