FTP 文件传输服务
昨晚心血来潮,尝试用python写了一个ftp文件传输服务,可以接收指令,从远程ftp服务器同步指定目录数据,最后没用上,开源出来。
https://github.com/jadepeng/ftp_transfer_service.git
运行原理
- 'task_server' 是一个web服务器,可以接收传入任务,接收到任务后,将task写入mysql
- 启动任务后,'task_server'会扫描ftp文件列表,写入redis队列
transfer_client是传输执行程序,可以多点部署,该程序会读取redis队列,进行文件下载
使用
配置
修改 .env 文件, 配置mysql和redis地址
REDIS_SERVER=""
REDIS_PORT=6380
REDIS_PASSWORD=""
MYSQL_HOST=""
MYSQL_PORT=3306
MYSQL_PASSWORD=""
MYSQL_USER=""
MYSQL_DB=""
启动服务
server 端
python3 task_server.py
传输端,可以部署多个
python3 transfer_client.py
接收任务
POST /task/
{
"taskId": "9",
"serverPath": "/weblog",
"storagePath": "/data",
"host": "ftpServer",
"port": 21,
"user": "user",
"password": "password"
}
启动传输
GET /task/{taskId}/start
查看进度
GET /task/{taskId}/progress
实现简介
第一次用fastapi来写web服务,这里记录下有意思的地方。
配置
可以通过配置类实现app的配置参数,pydantic还可以加载env文件更新配置
setting.py
from pydantic import BaseSettings
class APISettings(BaseSettings):
mysql_host: str = "127.0.0.1"
mysql_port: int = 3306
mysql_password: str
mysql_user: str
mysql_db: str
redis_server: str = "127.0.0.1"
redis_port: int = 6380
redis_password: str
max_wait_time_count: int = 10
class Config:
env_file = ".env"
env_file_encoding = 'utf-8'
redis 队列
通过list实现队列,rpush,blpop
import redis
class RedisQueue(object):
def __init__(self, name, namespace='queue', **redis_kwargs):
self.__db= redis.Redis(**redis_kwargs)
self.key = '%s:%s' %(namespace, name)
def qsize(self):
return self.__db.llen(self.key) # 返回队列里面list内元素的数量
def put(self, item):
self.__db.rpush(self.key, item) # 添加新元素到队列最右方
def get_wait(self, timeout=None):
item = self.__db.blpop(self.key, timeout=timeout)
return item
def get_nowait(self):
item = self.__db.lpop(self.key)
return item
redis BloomFilter
BloomFilter 可以用来去重
import mmh3
import redis
class BloomFilter(object):
def __init__(self, bf_key, bit_size=2000000, hash_count=4, start_seed=41, **redis_kwargs):
self.bit_size = bit_size
self.hash_count = hash_count
self.start_seed = start_seed
self.client = redis.Redis(**redis_kwargs)
self.bf_key = bf_key
def add(self, data):
bit_points = self._get_hash_points(data)
for index in bit_points:
self.client.setbit(self.bf_key, index, 1)
def madd(self, m_data):
if isinstance(m_data, list):
for data in m_data:
self.add(data)
else:
self.add(m_data)
def exists(self, data):
bit_points = self._get_hash_points(data)
result = [
self.client.getbit(self.bf_key, index) for index in bit_points
]
return all(result)
def mexists(self, m_data):
result = {}
if isinstance(m_data, list):
for data in m_data:
result[data] = self.exists(data)
else:
result[m_data] = self.exists[m_data]
return result
def _get_hash_points(self, data):
return [
mmh3.hash(data, index) % self.bit_size
for index in range(self.start_seed, self.start_seed +
self.hash_count)
]
python的orm框架sqlalchemy
sqlalchemy 需要先定义ORM类
class TransferTask(Base):
__tablename__ = 'transfer_task'
taskId = Column(String(255), primary_key=True, index=True)
serverPath = Column(String(255), nullable=False)
storagePath = Column(String(255), nullable=False)
host = Column(String(255), nullable=False)
port = Column(Integer, nullable=False)
user = Column(String(255), nullable=False)
password = Column(String(255), nullable=False)
time = Column(DateTime, nullable=False, default=datetime.now)
class TransferFailedFile(Base):
__tablename__ = 'transfer_failed_file'
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
taskId = Column(String(255), index=True)
filePath = Column(String(1024), nullable=False)
time = Column(DateTime, nullable=False, default=datetime.now)
class TransferProgress(Base):
__tablename__ = 'transfer_task_progress'
taskId = Column(String(255), primary_key=True, index=True)
total = Column(Integer, nullable=False)
status = Column(Integer, nullable=False)
finished = Column(Integer, nullable=False)
failed = Column(Integer, nullable=False)
time = Column(DateTime, nullable=False, default=datetime.now)
if __name__ == '__main__':
settings = APISettings()
db = Database(settings.mysql_host, settings.mysql_port, settings.mysql_user, settings.mysql_password,
settings.mysql_db)
Base.metadata.create_all(db.engine)
FTP 文件传输服务的更多相关文章
- FTP文件传输服务
FTP文件传输服务 一 .FTP 连接及传输的模式 l 控制连接:TCP21,用于发送FTP命令信息. l 数据连接:TCP 20, 用于上传下载数据. · 数据连接建立的类型: ·主动模式: 服 ...
- FTP文件传输服务!
一.FTP 连接及传输模式 1.控制连接:TCP 21,用于发送 FTP 命令信息2.数据连接:TCP 20,用于上传.下载数据3.数据连接的建立类型: (1)主动模式:服务器主动发起数据连接 (2 ...
- 网站优化与Cdn文件传输服务
网站优化与Cdn文件传输服务 如今互联网无处不在,其方便快捷.性质和低成本的经济特点,已经逐渐成为商务贸易.信息分发和数据交付的一个重要渠道.要想让数据的分发带来巨大的效益,那么网民的满意是唯一的办法 ...
- 【RL-TCPnet网络教程】第35章 FTP文件传输协议基础知识
第35章 FTP文件传输协议基础知识 本章节为大家讲解FTP(File Transfer Protocol,文件传输协议)的基础知识,方便后面章节的实战操作. (本章的知识点主要整理自网络) ...
- FTP文件传输服务器原理
FTP服务器,全称File Transfer Protocol Server,是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务.FTP,文件传输协议(File Transfer ...
- Python实现终端FTP文件传输
实现终端FTP文件传输 代码结构: .├── client.py├── readme.txt└── server.py 运行截图: readme.txt tftp文件服务器 项目功能: * 客户端有简 ...
- WCF大文件传输服务
由于项目需要,自己写一个基于WCF的大文件传输服务雏形.觉得有一定的参考价值,因此放在网上分享. 目前版本为v1.1特点如下: 1.文件传输端口为18650 2.上传和下载文件 3.支持获取文件传输状 ...
- SSIS 学习之旅 FTP文件传输-脚本任务
这一章主要讲解一下用脚本怎么把CSV文件抛送到FTP服务器上 设计: 通过Demon库的Users表数据生成CSV文件. 生成后的CSV文件抛送到FTP指定目录下. 控件的使用这里就不做详细讲 ...
- Python自带HTTP文件传输服务
一行命令搭建一个基于python的http文件传输服务 由于今天朋友想要一个文件,而我恰好有,因为这个文件比较大,网速不是很给力,所以想到了python自己有这么一个功能,这样不仅不需要下载其他软件, ...
随机推荐
- TypeError: 'encoding' is an invalid keyword argument for this function 解决Python 2.7
在python2.7中这样调用代码 open('file/name.txt','r',encoding= 'utf-8').read() 会出现 TypeError: 'encoding' is an ...
- Linux使用ssh测试端口
在windows上可以使用telnet客户端测试,在linux如果不方便安装telnet客户端的时候可以通关ssh来测试端口 具体命令如下 ssh -v -p 8080 root@59.207.252 ...
- 为什么Hashtab的大小通常取远离2^n 的素数
举个栗子 在Hashtab中我们通常 Hash(key) % M 来确定 key 所需要存放的位置 M就是Hashtab的大小,假设下面的两个场景 Hash(key1) = 108 Hash(key2 ...
- #ifndef #define #endif #ifdef 避免重复引用
一:在什么阶段处理 ? 预处理 预处理 预处理 首先注意这四个头文件保护符是在预处理阶段由系统默认的预处理器(Linux操作系统上默认是cpp)来处理的.它们的含义如下: #define XXX // ...
- postman使用(待更新)
参考文档
- React 三大属性state,props,refs以及组件嵌套的应用
React 三大属性state,props,refs以及组件嵌套的应用 该项目实现了一个简单的表单输入添加列表的内容 代码如下 <!DOCTYPE html> <html> & ...
- centos 添加sudo 权限
https://apple.stackexchange.com/a/82527 visudo user1 ALL=(user2) NOPASSWD: /bin/bash amy ALL=(AL ...
- Django 小实例S1 简易学生选课管理系统 8 CSS样式优化
Django 小实例S1 简易学生选课管理系统 第8节--CSS样式优化 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 前面的几节下来,用户模块基 ...
- Java String 转成 二位数组
... package str; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; impo ...
- java 邮件 接收与发送
... package com.e6soft; import java.io.BufferedReader; import java.io.FileOutputStream; import java. ...