一、实现逻辑
本实例采用相对简单的逻辑实现,用户在客户端使用软件时点击“检测升级”按钮,连接至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 globclass 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 = 60socket.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 ftpdef path_list(self,path: str) -> list:# 切换路径self.ftp .cwd(path)# 显示目录下所有目录信息self.ftp .dir()# 获取目录下的文件夹dir_list: list = self.ftp.nlst()# 排序dir_list.sort()return dir_listdef 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文件,无需更新''