码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-23 21:17:32      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

  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

 

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

标签:

原文地址:http://www.cnblogs.com/weixinbupt/p/4671400.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!