簡體   English   中英

如何使用套接字連接到 FTP 服務器?

[英]How to connect to an FTP server with sockets?

我正在嘗試創建一個簡單的 FTP 客戶端,但不知何故無法建立 FTP 連接。

我使用了以下代碼:

import socket 
sock = socket.socket() 
sock.connect(('localhost', 21)) 
data = 'USER adm\r\n'.encode() 
sock.send(data) 
print('Close') 
sock.close() 

我嘗試連接的 FTP 服務器的日志如下所示:

(048507)01.05.2018 06:00:03 - (未登錄) (127.0.0.1)> 已連接端口 21,正在發送歡迎消息...
(048507)01.05.2018 06:00:03 - (未登錄) (127.0.0.1)> 220-FileZilla Server 0.9.60 beta
(048507)01.05.2018 06:00:03 - (未登錄) (127.0.0.1)> 220-由 Tim Kosse (tim.kosse@filezilla-project.org) 撰寫
(048507)01.05.2018 06:00:03 - (未登錄) (127.0.0.1)> 220 請訪問https://filezilla-project.org/
(048507)01.05.2018 06:00:03 -(未登錄)(127.0.0.1)> 斷開連接。

我嘗試發送USER adm命令,但在日志中找不到它。 如何使用套接字與 FTP 服務器建立成功連接?

有幾個可能的時間問題。

FTP 是一種“服務器優先”協議。 您在日志中看到的 220 橫幅在連接被接受后立即由服務器發送。 客戶端應該在發送任何命令之前閱讀該橫幅。 (如果你得到除 220 以外的任何數字代碼,服務器是不願意說話的。)

出於測試目的,我建議您從服務器讀取並將您讀取的任何內容打印到標准輸出。 您服務器的 220 橫幅是多行 FTP 響應的一個示例,其中數字代碼后跟第一行的連字符,最后一行的后跟一個空格。 您應該繼續閱讀,直到在數字代碼后出現一行帶有空格的行。

如果您不這樣做,而只是在連接完成后立即發送USER ,那么您就是在說話不合時宜。 根據您的客戶端代碼運行的速度,服務器可能會在收到命令之前收到命令,這可以解釋為什么它沒有響應。

另一個可能的問題是您在發送USER后立即關閉連接,而不等待響應。 服務器也可能會注意到這一點。 即使它沒有嘗試檢測奇怪的客戶端行為,它在嘗試發送響應時也可能會收到寫入錯誤,這可以解釋為什么它沒有正常記錄。

偽代碼中FTP客戶端的整體結構是

connect
read response (banner)
while not done:
    send command
    read response
send QUIT
read response
close

(這省略了真正有趣的部分,即管理數據連接,但您還沒有做到這一點)。

對於您只想達到USER ,您至少需要:

connect
read banner
send USER
read response
close

(跳過QUIT可能不會造成任何傷害)

請注意,服務器可以對任何命令(包括USER返回多行響應,因此您應該始終檢查數字代碼后面的空格。 最好編寫一個子例程來讀取單個 FTP 響應,並在每個命令之后調用它。

從服務器讀取“第一響應”以驗證它是否“聽到”你,當服務器聽到你並“回復”一次時,循環讀取服務器的所有響應,直到服務器安靜沒有任何反應,就像等待它“說”完一樣。 然后您可以通過向服務器發送新數據來繼續與服務器“對話”。

根據其他答案和您的評論回復,您似乎從忽略服務器本身何時完成“談話”到期望它在 5 秒睡眠定時器后完成“談話”,這並不好。 最有效的方法是在再次作為客戶端“與服務器交談”之前“聆聽”所有服務器的“交談”響應。

這樣您就可以在服務器完成與您(客戶端)“交談”后立即與服務器“交談”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM