python实现FTP文件传输的方法(服务器端和客户端)


Posted in Python onMarch 20, 2020

用python实现FTP文件传输,包括服务器端和客户端,要求

(1)客户端访问服务器端要有一个验证功能

(2)可以有多个客户端访问服务器端

(3)可以对重名文件重新上传或下载

FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。它工作在TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。

python实现FTP文件传输的方法(服务器端和客户端)

服务器端

 首先要实现对访问客户端的验证,在本地建立一个数据库文件,将客户端的用户名和密码写入到文件中。这样每次访问时都将用户名和密码和数据库中存在的进行匹配,实现验证功能。这里对密码进行了MD5加密,保证了密码不会轻易泄露。

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

登录验证功能具体实现

#!/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()

服务器端代码

#!/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

总结

到此这篇关于python实现FTP文件传输(服务器端和客户端) 的文章就介绍到这了,更多相关python ftp 文件传输内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现问号表达式(?)的方法
Nov 27 Python
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
Python使用函数默认值实现函数静态变量的方法
Aug 18 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
Python读取properties配置文件操作示例
Mar 29 Python
Python创建一个空的dataframe,并循环赋值的方法
Nov 08 Python
python实现公司年会抽奖程序
Jan 22 Python
Pytorch 实现数据集自定义读取
Jan 18 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
Python基于gevent实现高并发代码实例
May 15 Python
教你怎么用Python selenium操作浏览器对象的基础API
Jun 23 Python
python实现ftp文件传输系统(案例分析)
Mar 20 #Python
关于Python 中的时间处理包datetime和arrow的方法详解
Mar 19 #Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 #Python
Python文件操作基础流程解析
Mar 19 #Python
Python函数基本使用原理详解
Mar 19 #Python
Python ATM功能实现代码实例
Mar 19 #Python
详解django使用include无法跳转的解决方法
Mar 19 #Python
You might like
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
angular.bind使用心得
2015/10/26 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
python返回昨天日期的方法
2015/05/13 Python
使用Python微信库itchat获得好友和群组已撤回的消息
2018/06/24 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
基于Python解密仿射密码
2019/10/21 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
科研课题实施方案
2014/03/18 职场文书
干部个人对照检查材料
2014/08/25 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
团代会邀请函
2015/02/02 职场文书
单位同意报考证明
2015/06/17 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书