You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:37:47