一、实现逻辑
本实例采用相对简单的逻辑实现,用户在客户端使用软件时点击“检测升级”按钮,连接至FTP服务器检索是否有新版本的·.exe
,如果有,下载最新的.exe
安装升级。
本实例服务端待下载.exe
所在目录结构
本实例客户端待更新.exe
所在目录结构
二、搭建服务器
可以参考我的这篇博客:《二、Cpolar 内网穿透 FileZilla :避开所有坑点》
三、程序实现
01.FTP连接相关程序:
提供以下功能:
①FTP服务器的连接,需要输入FTP服务器的域名、端口号、用户名、密码。
②从FTP服务器获取规定用户可以访问的文件目录。
③从FTP服务器下载指定的文件。
④获取FTP服务器上指定文件的大小。
⑤获取FTP服务器/客户端 的软件版本号。
ftp_tools.py
import socket
from ftplib import FTP
import os
import glob
class LinkFTP:
"""
连接 FTP 服务器
"""
def __init__(self, host: str, port: int, username: str, password: str):
self.ftp = self.login_ftp(host,port,username,password)
# 登录FTP服务器
def login_ftp(self, host: str, port: int, username: str, password: str):
timeout = 60
socket.setdefaulttimeout(timeout)
ftp = FTP()
# 设置为被动模式,必须设置,不然即使连接到服务器也无法读取文件
ftp.set_pasv(True)
ftp.encoding = 'utf-8' # 'gbk'
ftp.connect(host, port)
ftp.login(username, password)
#打印欢迎信息,服务端设置
print(ftp.welcome)
return ftp
def path_list(self,path: str) -> list:
# 切换路径
self.ftp .cwd(path)
# 显示目录下所有目录信息
self.ftp .dir()
# 获取目录下的文件夹
dir_list: list = self.ftp.nlst()
# 排序
dir_list.sort()
return dir_list
def Update_detection(self,remote_path: str, local_path: str):
'''
:param remote_path: 远程服务器 .exe文件所在文件路径
:param local_path: 本地 .exe文件所在路径
:return:
'''
#本地文件夹
if not os.path.exists(local_path):
os.makedirs(local_path)
# ftp切换到.exe所在的文件路径
self.ftp.cwd(remote_path)
# 获取exe所在的文件路径目录列表
dir_list = self.ftp.nlst()
# print(dir_list)
symbol = 0
'''
symbol = 0:需要更新
symbol = 1:已经是最新,不需要更新
symbol = 2:版本号一致,但文件不完整(下载中断时),需要更新
symbol = 3:远程服务器指定文件夹没有.exe文件,无需更新
''