Python中FTP.connect超时后自定义提示及重试连接的实现方案
解决FTP连接超时的提示与重试问题
你可以通过异常捕获结合循环重试的方式实现这个需求,当连接超时或失败时给出明确提示,同时支持自动重试。下面是修改后的完整代码,我还加了一些实用的细节优化:
from ftplib import FTP import socket import time # 可配置参数,方便你根据实际情况调整 FTP_HOST = '192.168.0.24' FTP_PORT = 2121 CONNECT_TIMEOUT = 5 MAX_RETRY_TIMES = 3 # 最多重试3次 RETRY_WAIT_SECONDS = 5 # 每次重试前等待5秒 def sync_ftp_files(): retry_count = 0 while retry_count < MAX_RETRY_TIMES: try: ftp = FTP() print(f"正在尝试第 {retry_count+1} 次连接FTP服务器...") ftp.connect(host=FTP_HOST, port=FTP_PORT, timeout=CONNECT_TIMEOUT) ftp.login() ftp.cwd('MIUI/sound_recorder/call_rec') # 遍历并处理文件 for filename in ftp.nlst(): if filename not in ['.', '..']: # 处理FTP文件名编码问题 local_filename = filename.encode('latin-1').decode() with open(local_filename, 'wb') as f_output: ftp.retrbinary(f'RETR {filename}', f_output.write) ftp.delete(filename) print(f"已完成文件处理: {local_filename}") ftp.quit() print("所有文件同步完成!") return # 成功完成任务,退出函数 except socket.timeout: retry_count += 1 print("连接超时!请检查智能手机上的FTP服务器是否已开启。") if retry_count < MAX_RETRY_TIMES: print(f"将在 {RETRY_WAIT_SECONDS} 秒后重试...") time.sleep(RETRY_WAIT_SECONDS) except ConnectionRefusedError: retry_count += 1 print("连接被拒绝!请确认FTP服务器已启动,且IP/端口配置正确。") if retry_count < MAX_RETRY_TIMES: print(f"将在 {RETRY_WAIT_SECONDS} 秒后重试...") time.sleep(RETRY_WAIT_SECONDS) except Exception as e: print(f"发生未知错误: {str(e)}") break # 非超时/连接问题的错误,直接终止重试 # 所有重试都失败时的提示 print(f"已尝试 {MAX_RETRY_TIMES} 次连接,均失败。请检查FTP服务器状态后重新运行脚本。") if __name__ == "__main__": sync_ftp_files()
关键细节说明:
- 异常精准捕获:专门针对
socket.timeout(对应你设置的5秒超时)和ConnectionRefusedError(服务器未开启时的常见错误)做提示,用户能快速定位问题。 - 可控的重试逻辑:通过
MAX_RETRY_TIMES和RETRY_WAIT_SECONDS限制重试次数和间隔,避免无限循环,同时给用户足够时间去开启服务器。 - 清晰的用户反馈:每一步操作都有明确的打印提示,用户能清楚知道脚本当前状态。
- 保留原有功能:完全兼容你原来的文件下载、删除逻辑,没有改动核心业务流程。
内容的提问来源于stack exchange,提问作者Antoni
相关产品推荐
相关产品推荐

