不管工作中还是其他场合,经常会有文件分享的需求,比如自己下了一个4GB的游戏,同事下了一个800MB的软件,其他人如果也需要这些文件,显然直接分享是最快捷、最方便、最环保的方式了,如果再重新下,既浪费时间,又浪费电。Windows自带了文件夹共享的功能,不过这玩意儿,至今我还没仔细的去折腾过,也没搞明白原理,我一直使用FTP来分享文件,如果有需要的话再弄个HTTP服务也足够应付了,我的目的仅仅只是文件分享,简单、易用是我主要关注的点。

反复可耻

这种需求必然是非常普遍的,解决方法也是多种多样。比如飞鸽传书、QQ,或者各种局域网通信软件以及网盘都可以,不过这些都需要点对点的操作,也就是说对方需要什么文件,你就要把该文件发送过去,多一个人就需要多发一次,不能重用,对于程序员来说,不能接受,反复可耻!我觉得,文件服务器更符合这种需求,目前已经有很多成熟的软件可以方便的实现这种需求,比如,FTP可以选择FileZilla,HTTP可以选择ApacheNginx。当然,成熟意味着软件更复杂,更大的学习成本、更多磁盘占用,这要看你的需求的复杂程度。

折腾至死

好了,我需要说明,我是个喜欢折腾的人,将一件看起来复杂、学习成本高的事情,折腾到简单、易用是我的终极爱好,这篇文章正是这种折腾后的产物,希望直接达到目的的,成熟的软件是你最好的归宿。喜欢折腾,换种程序员喜欢的说法是,我热衷于把复杂的实现,隐藏在良好命名的接口下。再换种通俗点的说法,汽车内部构造精良、结构复杂,而你只需要通过操作方向盘、刹车以及油门,就可以很好的操控它,这都归功于这些接口的友好实现。

同样的事情,只需要一遍就好。在平时写代码,也是这样。如果我需要别人提供的一个接口,那我希望这个接口使用起来尽量简单,我只需要知道调用什么接口、传什么参数就行。我自己写代码,一定严格按照这种思路,我不认为使用者需要关注我是如何实现的,那是我的问题,使用者需要关注的是这个接口是干什么的、需要什么参数、可能返回的结果以及可能抛出的错误,分工明确,减少不必要的沟通。

我在前面一遍文章中有提到Python--导出指定文件夹中as文件的完全限定类名,好处我就不多说了,一个字,性感!很巧的是,我在折腾这个文件分享的功能时,遇到了他,借着这个机会,又复习了一遍HTTP和FTP方面的内容。

Python版HTTP服务器

闲话少说,首先确保装了Python,我装的是2.x版本,对了,我的操作系统是WIN7,其实对于Python来说,什么操作系统并不重要。Python内置了一个简单的HTTP服务器,只需要在命令行下面敲一行命令,一个HTTP服务器就起来了:

python -m SimpleHTTPServer 80

后面的80端口是可选的,不填会采用缺省端口8000。注意,这会将当前所在的文件夹设置为默认的Web目录,试着在浏览器敲入本机地址:

http://localhost:80

如果当前文件夹有index.html文件,会默认显示该文件,否则,会以文件列表的形式显示目录下所有文件。这样已经实现了最基本的文件分享的目的,你可以做成一个脚本,再建立一个快捷方式,就可以很方便的启动文件分享了。如果有更多需求,完全可以根据自己需要定制,具体的请参见官方文档SimpleHTTPServer,或者直接看源码。我拷贝一段,方便参考:

import SimpleHTTPServer
import SocketServer PORT = 8000 Handler = SimpleHTTPServer.SimpleHTTPRequestHandler httpd = SocketServer.TCPServer(("", PORT), Handler) print "serving at port", PORT
httpd.serve_forever()

Python版FTP服务器

看到这里,默认你已经安装了Python,不过你还需要安装另外一个好用的工具。你知道,当需要找Chrome插件的时候,会去GoogleWebStore;当需要找Firefox应用的时候,会去MozillaAdd-ons;当你需要找Python组件的时候,你需要pip:A tool for installing and managing Python packages,安装方法就不介绍了。

Python没有内置一个直接可以用的FTP服务器,所以需要第三方组件的支持,我找到的这个组件叫pyftpdlib,首先安装:

pip install pyftpdlib

安装完后,和HTTP服器类似,执行以下命令就可以启动一个FTP服务器了:

python -m pyftpdlib -p 21

后面的21端口依然是可选的,不填会随机一个,被占用的端口将跳过。在浏览器敲入本机地址:

ftp://localhost:21

这时候,是匿名访问,也就是用户名是anonymous,密码为空,如果想要控制访问权限,你需要自己定制服务器,具体的可以参看pyftpdlib Tutorial,我这里拷贝过来一段作为介绍:

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer def main():
# Instantiate a dummy authorizer for managing 'virtual' users
authorizer = DummyAuthorizer() # Define a new user having full r/w permissions and a read-only
# anonymous user
authorizer.add_user('user', '12345', '.', perm='elradfmwM')
authorizer.add_anonymous(os.getcwd()) # Instantiate FTP handler class
handler = FTPHandler
handler.authorizer = authorizer # Define a customized banner (string returned when client connects)
handler.banner = "pyftpdlib based ftpd ready." # Specify a masquerade address and the range of ports to use for
# passive connections. Decomment in case you're behind a NAT.
#handler.masquerade_address = '151.25.42.11'
#handler.passive_ports = range(60000, 65535) # Instantiate FTP server class and listen on 0.0.0.0:2121
address = ('', 2121)
server = FTPServer(address, handler) # set a limit for connections
server.max_cons = 256
server.max_cons_per_ip = 5 # start ftp server
server.serve_forever() if __name__ == '__main__':
main()

只看代码应该基本知道该怎么用了,add_user显然是添加用户,2121是指定端口,当然也可以随机,还有最大连接数max_cons,每个ip最大连接限制,更多的接口建议直接看docstrings

后记

Python第三方组件就是个大宝库,基本上我自己遇到的大部分问题都可以在这里面找到解决文案。同时,建议喜欢折腾的程序员,甚至没有程序背景的IT人员,都尝试学习一下这门语言,这对解决问题的能力以及思维的锻炼都有莫大裨益。

使用Python创建简单的HTTP和FTP服务的更多相关文章

  1. python创建简单网站

    前言 本方法基于web2py框架,使用web2py的完整网站数据包创建简单网站. web2py 是一个为Python语言提供的全功能Web应用框架,旨在敏捷快速的开发Web应用,具有快速.安全以及可移 ...

  2. 如何用Qt Python创建简单的桌面条形码应用

    Qt for Python可以快速跨平台的GUI应用.这篇文章分享下如何结合Dynamsoft Barcode Reader SDK来创建一个简单的读码应用. 安装Qt for Python 官方站点 ...

  3. Windows 下开启FTP服务并创建FTP用户

    Windows 下开启FTP服务,并创建用户 此教程教你怎么开启 Windows 的 FTP 服务,并创建用于登入 FTP 的用户.教程用到的操作系统是 Windows 7. 一.创建用于登入 FTP ...

  4. 如何对CentOS FTP服务配置

    根据很多人对CentOS FTP服务的不解,我觉得应该对CentOS FTP服务做出一定的解释. 1.安装 一般在CentOS上都自动安装了vsftd,若没有安装则可以使用以下步骤进行安装yum -y ...

  5. ubuntu下安装ftp服务

    1. 安装vsftpd $ sudo apt-get install vsftpd 2. 创建一个用户user-ftp用于ftp服务 $ sudo adduser user-ftp 3.创建一个文件/ ...

  6. 用python开发简单ftp程序

    根据alex老师视频开发的简单ftp程序,只能实现简单的get功能 ftp客户端程序: #!/usr/bin/env python #_*_ coding:utf-8 _*_ import socke ...

  7. Python——一个简单的类的创建和应用

    1.创建类,设置属性和给属性设定默认值,设置方法并访问类的属性: 2.利用类创建多个实例,以及调用类的方法的两种办法: 3.设置更新属性的函数,并更新实例的属性. class dog(object): ...

  8. 一句python代码搭建FTP服务

    环境搭建: python windows/linux pip install pyftpdlib (安装失败请到这里下载:https://pypi.python.org/pypi/pyftpdlib/ ...

  9. python + docker, 实现天气数据 从FTP获取以及持久化(三)-- python获取FTP数据

    前言 经过前面两个小节的介绍,我们已经完成了MySQL数据库的搭建和数据库操作的事宜. 在本小节中,我们需要完成的任务是:使用python从FTP服务其上面获取文本文件. 搭建测试FTP服务器 LZ的 ...

随机推荐

  1. cocos2dx 3.x(在Mac平台下利用Eclipse打包安卓apk安装包详细教程)

    最近在学习cocos2dx在MAC上如何打包apk,今天先把安装JDK和ANT的过程记来. 首先,打开终端,输入"java -version" 点击回车后,出现如下提示: 我们的M ...

  2. 面向对象php基本格式、构造、析构、访问修饰符

    <?php//面向对象//1.类//由众多的对象抽象出来的 //2.对象//一切皆对象//由类实例化出来的 //基本形式class 类名{ 成员变量 成员方法 } $对象名 =new 类名 $对 ...

  3. Java集合---ArrayList的实现原理

    目录: 一. ArrayList概述 二. ArrayList的实现 1) 私有属性 2) 构造方法 3) 元素存储 4) 元素读取 5) 元素删除                 6) 调整数组容量 ...

  4. c#与.net的简介

    c语言诞生于上世纪60年代,后来诞生了面向对象的c++,后来出现看更为精简的java,微软之后又出了c#语言.早期的c#语言和java语言类似.经过长足的发展,c#变得越来越完美. 面向对象 简单,安 ...

  5. 禁用链接 <a>

    pointer-events Syntax /* Keyword values */ pointer-events: auto; pointer-events: none; pointer-event ...

  6. MySQL functions, IF, CASE

    MySQLTutorial官网 IF function syntax: IF(expr,if_true_expr,if_false_expr) CASE expression syntax: CASE ...

  7. 一个用php写的人民币数字转人民币大写的函数

      function num2rmb ($num) {     $c1 = "零壹贰叁肆伍陆柒捌玖";     $c2 = "分角元拾佰仟万拾佰仟亿";     ...

  8. POJ 2195:Going Home(最小费用最大流)

    http://poj.org/problem?id=2195 题意:有一个地图里面有N个人和N个家,每走一格的花费是1,问让这N个人分别到这N个家的最小花费是多少. 思路:通过这个题目学了最小费用最大 ...

  9. jquery之empty()方法详解

    empty()函数用于清空每个匹配元素内的所有内容. empty()函数将会移除每个匹配元素的所有子节点(包括文本节点.注释节点等所有类型的节点). 该函数属于jQuery对象(实例). 语法 jQu ...

  10. 激活、复制、使用R/3标准数据源(RSA5、RSA6、RSA1)

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...