FTP连接故障排查:对接证券交易所外部FTP站点的接口开发问题
解决隐式FTP over TLS连接问题
Hey there, let's break down why your FTP connection is hanging without any feedback and fix it step by step!
核心问题分析
Your target FTP site requires Require implicit FTP over TLS, but your current code has a few critical issues:
- You're using the regular
ftplib.FTPclass instead of handling implicit TLS correctly - You've set an impossible timeout of
0.001seconds (way too short to establish any connection) - You're calling
login()twice, which will cause unexpected behavior - Implicit TLS needs an immediate switch to encrypted mode right after connecting
修正后的代码
Here's a corrected version that handles implicit FTP over TLS properly, with error handling to show you exactly what's going wrong:
from ftplib import FTP_TLS def connectftp(): # 隐式FTP over TLS默认使用990端口(你的端口未填写,这是标准默认值) ftp = FTP_TLS('212.31.105.26', port=990, timeout=30) # 隐式TLS要求连接后立即切换到加密模式 ftp.prot_p() # 获取并打印服务器欢迎信息 welcome_msg = ftp.getwelcome() print("服务器欢迎信息:", welcome_msg) # 执行登录(只需要调用一次!) login_response = ftp.login(user='L12', passwd='GetConnected') print("登录响应:", login_response) # 可选:通过列出目录内容测试连接是否正常 print("\n当前目录文件列表:") ftp.dir() # 关闭连接 ftp.quit() if __name__ == "__main__": try: connectftp() except Exception as e: print("\n连接出错啦:", str(e))
关键说明
- 隐式TLS vs 显式TLS:隐式TLS从连接建立开始就全程加密(使用990端口),而显式TLS是先明文连接再升级加密。你的目标站点要求隐式,所以我们用
FTP_TLS类+990端口+立即调用prot_p()来切换加密。 - 超时设置:0.001秒的超时完全不合理,30秒的设置给网络连接留出了足够的时间。
- 错误捕获:
try-except块会捕获并显示超时、凭证错误、防火墙拦截等问题,再也不会出现毫无响应的情况。
额外排查点
如果还是连接失败,可以检查这些内容:
- 确认目标站点的端口确实是990(部分自定义配置可能使用其他端口)
- 确保你的防火墙/网络允许访问
212.31.105.26的990端口 - 仔细核对用户名和密码的正确性(即使你提供的是示例,真实环境中务必确认)
内容的提问来源于stack exchange,提问作者Nelboy13




