如何用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
相关产品推荐
相关产品推荐

