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

如何用Socket连接FTP服务器?连接失败问题求助

无法完成FTP连接?你的代码漏掉了FTP协议的核心交互步骤!

嘿,看了你的代码和服务器日志,问题一下子就找到了——你只发送了USER命令,完全没等服务器返回响应,也没完成登录的后续步骤就直接关闭连接了!

FTP是一个交互式的文本协议,每一步操作都需要客户端和服务器来回确认:服务器发响应,客户端再发下一个命令。你的代码现在就像刚跟服务器打了个招呼,转头就走了,根本没完成登录流程。

先看你的原代码,问题点很明显:

import socket
sock = socket.socket()
sock.connect(('localhost', 21))
data = 'USER adm\r\n'.encode()
sock.send(data)
print('Close')
sock.close()  # 这里过早关闭连接,服务器还没来得及处理完USER请求!

再看服务器日志:

(048507)01.05.2018 06:00:03 - (not logged in) (127.0.0.1)> Connected on port 21, sending welcome message...
(048507)01.05.2018 06:00:03 - (not logged in) (127.0.0.1)> 22...

服务器刚建立连接,正准备发欢迎消息/处理你的USER请求,你就断开了,自然无法建立有效的连接。

给你修正后的代码,补上了协议交互的关键步骤:

import socket

sock = socket.socket()
sock.connect(('localhost', 21))

# 第一步:接收服务器的初始欢迎消息
welcome_response = sock.recv(1024).decode()
print("服务器欢迎信息:", welcome_response)

# 第二步:发送USER命令,并接收响应
user_cmd = 'USER adm\r\n'.encode()
sock.send(user_cmd)
user_response = sock.recv(1024).decode()
print("USER命令响应:", user_response)

# 第三步:发送PASS命令(替换成你的FTP账户密码),完成登录
pass_cmd = 'PASS your_ftp_password\r\n'.encode()
sock.send(pass_cmd)
pass_response = sock.recv(1024).decode()
print("PASS命令响应:", pass_response)

# 登录成功后,就可以执行其他FTP命令了,比如获取目录列表
# list_cmd = 'LIST\r\n'.encode()
# sock.send(list_cmd)
# list_response = sock.recv(4096).decode()
# print("目录列表:", list_response)

# 最后再关闭连接
sock.close()

几个关键注意点:

  • 每次发送命令后,必须调用recv()接收服务器的响应,确保协议流程同步
  • FTP登录需要USER + PASS两个命令配合,只发USER是无法完成登录的
  • 如果服务器返回的内容较多,要适当增大recv()的缓冲区(比如从1024改成4096)

内容的提问来源于stack exchange,提问作者kavasak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:02:39