使用Python创建简单的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

 

 

转自:https://www.cnblogs.com/yili16438/p/d3209323913c6d53e6060fcd8d27e4c0.html

转载于:https://www.cnblogs.com/lazyfang/p/8053065.html

Python自带了一个ftplib模块,可以用来创建FTP服务器。下面是一个简单Python脚本,用于创建一个FTP服务器: ```python import os import sys from ftplib import FTP from threading import Thread class FTPHandler(FTP): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.cwd = os.getcwd() def cdup(self): self.cwd = os.path.dirname(self.cwd) super().cwd(self.cwd) def cwd(self, path): self.cwd = os.path.join(self.cwd, path) super().cwd(self.cwd) def handle_client(client_socket): """ 处理客户端请求 """ ftp = FTPHandler() ftp.set_pasv(True) ftp.sock = client_socket print('FTP连接来自:', client_socket.getpeername()) ftp.welcome = 'Welcome to my FTP server.' ftp.login() while True: try: cmd = client_socket.recv(1024).decode() if not cmd: break print(cmd) cmd = cmd.split() if cmd[0] == 'QUIT': ftp.quit() break elif cmd[0] == 'CWD': ftp.cwd(cmd[1]) client_socket.send(b'250 Directory changed.\r\n') elif cmd[0] == 'CDUP': ftp.cdup() client_socket.send(b'200 Directory changed.\r\n') elif cmd[0] == 'PWD': client_socket.send(('257 "%s"\r\n' % ftp.cwd).encode()) elif cmd[0] == 'LIST': data_socket, addr = ftp.transfercmd('LIST') client_socket.send(b'150 Here comes the directory listing.\r\n') data = data_socket.recv(1024) while data: client_socket.send(data) data = data_socket.recv(1024) data_socket.close() client_socket.send(b'226 Directory send OK.\r\n') elif cmd[0] == 'RETR': file = open(os.path.join(ftp.cwd, cmd[1]), 'rb') data_socket, addr = ftp.transfercmd('RETR ' + cmd[1]) client_socket.send(b'150 Opening data connection.\r\n') data = file.read(1024) while data: data_socket.send(data) data = file.read(1024) file.close() data_socket.close() client_socket.send(b'226 Transfer complete.\r\n') else: client_socket.send(('502 Command not implemented.\r\n').encode()) except Exception as e: print(e) break client_socket.close() def main(): """ 启动服务器 """ host = '' port = 21 backlog = 5 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((host, port)) server_socket.listen(backlog) print('FTP服务器已经启动,监听端口为:', port) while True: try: client_socket, addr = server_socket.accept() Thread(target=handle_client, args=(client_socket,)).start() except KeyboardInterrupt: sys.exit(0) if __name__ == '__main__': main() ``` 该脚本启动一个FTP服务器,监听21端口。在客户端输入命令时,它会响应CWD、CDUP、PWD、LIST和RETR命令。 使用该脚本非常简单,只需要运行该脚本即可启动一个FTP服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值