Python实现FTP文件传输:服务器端与客户端完整指南

栗子
栗子
发布时间:2026-10-13| 6人浏览过
原创

本文详细介绍如何使用Python实现FTP文件传输系统,涵盖服务器端与客户端的核心代码。重点解析用户身份验证机制、多客户端并发访问支持以及重名文件处理策略,并演示断点续传功能的实现逻辑。通过具体的代码示例,帮助开发者快速搭建基于TCP的可靠文件传输服务。

Python FTP传输需求概述

使用Python实现FTP文件传输功能,需同时构建服务器端与客户端程序,并满足特定的业务需求。

首先,客户端在访问服务器时必须具备身份验证功能,确保只有授权用户才能进行操作。

其次,系统架构需支持多个客户端同时连接并访问服务器端资源。

最后,系统需具备处理重名文件的能力,允许用户对已存在的文件进行重新上传或下载操作。

FTP协议基础

FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的重要组成部分。该协议由两部分组成:FTP服务器和FTP客户端。FTP服务器负责存储文件,用户则通过FTP客户端访问位于服务器上的资源。在Web开发中,常利用FTP协议将网页或程序部署到Web服务器。FTP工作在TCP模型的应用层,使用TCP传输而非UDP。在建立连接前,需经过“三次握手”过程,以确保连接的可靠性,从而为数据传输提供保障。

服务器端实现

服务器端实现

首要任务是实现对访问客户端的身份验证。具体做法是在本地建立数据库文件,将客户端的用户名和密码写入其中。每次访问时,系统会将输入的用户名和密码与数据库中的记录进行匹配,从而实现验证功能。在此实现中,密码采用了MD5加密方式,以保障密码不易泄露。

{"username": "ahpu", "password": "96e79218965eb72c92a549dd5a330112", "limitsize": 10240000, "homepath": "D:\\FTP\\home\\ahpu"}

登录验证功能

登录验证功能的具体实现逻辑如下:服务器接收客户端发送的账户信息(用户名和密码),对密码进行MD5哈希处理,然后查找对应的用户数据库文件。若文件存在且哈希值匹配,则返回成功状态码及用户信息;若密码错误或用户名不存在,则返回相应的错误状态码。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : hgh
import hashlib
import os
import json
from conf import settings
class User_auth(object):
 def auth(self, account_info):
 """
 #此功能是进行用户的登录信息验证,如果登录成功,那么返回用户对应的http状态码及账户信息,否则只返回http状态码
 :param account_info: 用户的账户信息:用户名,密码
 :return:
 """
 name = account_info.split(":")[0]
 pwd = account_info.split(":")[1]
 pwd = self.hash(pwd.encode()) # 将用户名的密码转换成hash值
 user_db_file = settings.DATABASE + r"\%s.db" % name # 也可以写成 "\\%s.db" or "/%s.db"
 if os.path.isfile(user_db_file): # 输入的用户名存在
  with open(user_db_file) as fr:
  user_db_info = json.loads(fr.read()) # or josn.load(fr)
  if pwd == user_db_info['password']:
   return "200", user_db_info # 确定,客户请求成功
  else:
   return "403.11", None # 密码错误
 else:
  return "400", None # 用户名不存在,用户认证失败
 def hash(self, pwd):
 """
  用户的密码加密
 :param self:
 :param pwd: 用户密码
 :return:
 """
 m = hashlib.md5()
 m.update(pwd)
 return m.hexdigest()

断点续传功能

接下来实现断点续传(重传)功能。该功能用于确认用户上传或下载的文件状态,判断文件是否已存在以及是否需要从断点处继续传输。系统通过记录已发送的文件大小和文件总大小,定位文件指针到指定位置,从而支持大文件的可靠传输。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : hgh
import hashlib
import sys
class Breakpoint(object):
 # 本模块确认用户上传或下载的文件是否存在,如果存在是否需要断点续传
 def transfer(self, filename, has_send_size, total_size, conn):
 """
 进行续传
 :param filename:
 :param has_send_size: 已经发送的文件大小
 :param total_size: 需要传输文件总大小
 :param conn: 客户端和服务端进行数据交换的接口
 :return:
 """
 with open(filename, 'rb') as fr:
  fr.seek(has_send_size) # 定位到续传的位置
  print("has_send", has_send_size, "total", total_size)
  m = hashlib.md5()
  if has_send_size == total_size:
  self.progress_bar(has_send_size, total_size)
  for line in fr:
  conn.send(line)
  m.update(line)
  has_send_size += len(line)
  # self.progress_bar(has_send_size,total_size)
 return m.hexdigest()
 def progress_bar(self, has_send_size, total_size):
 bar_width = 50 # 进度条长度
 process = has_send_size / total_size
 send_bar = int(process * bar_width + 0.5) # 发送的数据占到的进度条长度,四舍五入取整
 sys.stdout.write("#" * send_bar + "=" * (bar_width - send_bar) + "\r") # 注意点:只能这么写才能达到要求
 sys.stdout.write("\r%.2f%%: %s%s" % (process * 100, "#" * send_bar, "=" * (bar_width - send_bar))) # 注意点:在pycharm中要加\r\n
         # 用sublime只要\r否则换行
 sys.stdout.flush()

服务器端代码

服务器端核心代码包含用户认证模块、断点续传模块以及基于多线程的Socket服务器启动逻辑。服务器监听指定主机和端口,处理来自客户端的连接请求,并调用相应的业务逻辑类进行文件操作。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : hgh
import sys
import os
from core import socket_server
path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(path)
if __name__ == "__main__":
 HOST, PORT = "192.168.40.1", 9901
 server = socket_server.socketserver.ThreadingTCPServer((HOST, PORT), socket_server.MyTCPServer)
 server.serve_forever()

客户端实现

客户端实现


 #!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : hgh
from core import socket_client
import os
import sys
path = os.path.dirname(os.path.abspath(__file__))
sys.path.append(path)
if __name__ == "__main__":
 host, port = "192.168.40.1", 9901
 myClient = socket_client.MySocketClient(host, port)
 myClient.start()

代码获取与总结

由于篇幅限制,完整的服务器端及客户端代码已托管于GitHub,访问地址为https://github.com/heguohang/FTP-python。客户端代码主要包含Socket连接初始化、登录验证调用以及文件上传下载的具体交互逻辑。

总结

本文介绍了使用Python实现FTP文件传输(包括服务器端和客户端)的方法。更多相关Python FTP文件传输的内容,可搜索本站以前的文章或继续浏览后续相关文章。希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。