python编写ftp客户端_用Python写FTP客户端程序
0 前言:
ftp客戶端相信大家都用過(guò),那么我們?yōu)槭裁催€要用Python寫ftp客戶端呢?
我想有兩個(gè)原因:
一是寫出更好的ftp客戶端應(yīng)用程序,方便大家使用;
二是定制一些特殊服務(wù),例如每天定時(shí)下載/上傳某文件;
我還沒(méi)能力也沒(méi)時(shí)間寫出ftp客戶端應(yīng)用程序,前期先分析一下python寫ftp客戶端的核心部分,即實(shí)現(xiàn)上傳和下載的關(guān)鍵部分。
首先看一下ftp服務(wù)器/客戶端架構(gòu):
1 FTP服務(wù)器/客戶端
ftp架構(gòu)
上圖展示了ftp的工作流程:
1.客戶端連接遠(yuǎn)程主機(jī)上的FTP 服務(wù)器。
2.客戶端輸入用戶名和密碼(或“anonymous”和電子郵件地址)。
3.客戶端進(jìn)行各種文件傳輸和信息查詢操作。
4.客戶端從遠(yuǎn)程FTP 服務(wù)器退出,結(jié)束傳輸。
下面是一段Python偽代碼。from?ftplib?import?FTP
f?=?FTP('some.ftp.server')
f.login('anonymous',?'your@email.address')
:
f.?quit()
當(dāng)然,這只是一般情況下的流程。有時(shí),由于網(wǎng)絡(luò)兩邊計(jì)算機(jī)的崩潰或網(wǎng)絡(luò)的問(wèn)題,會(huì)導(dǎo)致整個(gè)傳輸在完成之前就中斷。
如果客戶端超過(guò)15 分鐘(900 秒)還沒(méi)有響應(yīng),FTP 連接就會(huì)超時(shí)并中斷。
在底層,FTP 只使用TCP,而不使用UDP。
另外,可以將FTP 看作客戶端/服務(wù)器編程中的特殊情況。因?yàn)檫@里的客戶端和服務(wù)器都使用兩個(gè)套接字來(lái)通信:
一個(gè)是控制和命令端口(21 號(hào)端口),另一個(gè)是數(shù)據(jù)端口(有時(shí)是20 號(hào)端口),如上圖 所示。
FTP 有兩種模式:主動(dòng)和被動(dòng)。只有在主動(dòng)模式下服務(wù)器才使用數(shù)據(jù)端口。
在服務(wù)器把20 號(hào)端口設(shè)置為數(shù)據(jù)端口后,它“主動(dòng)”連接客戶端的數(shù)據(jù)端口。而在被動(dòng)模式下,服務(wù)器只是告訴客戶端隨機(jī)的數(shù)據(jù)端口號(hào),客戶端必須主動(dòng)建立數(shù)據(jù)連接。
2 客戶端FTP 程序示例#!/usr/bin/env?python#?coding=utf-8import?ftplib
import?os
import?socket
import?pdb
HOST?=?'ftp.debian.org'DIRN?=?'debian/tools'FILE?=?'loadlin.exe'def?main():????try:
f?=?ftplib.FTP(HOST)
except?(socket.error,?socket.gaierror)?as?e:????????print?'ERROR:?cannot?reach?"%s"'?%?HOST????????return
print?'***?Connected?to?host?"%s"'?%?HOST????try:
f.login()
except?ftplib.error_perm:????????print?'ERROR:?cannot?login?anonymously'
f.quit()????????return
print?'***?Logged?in?as?"anonymous"'
try:
f.cwd(DIRN)
except?ftplib.error_perm:????????print?'ERROR:?cannot?CD?to?"%s"'?%?DIRN
f.quit()????????return
print?'***??changed?to?"%s"?folder'?%?DIRN????try:
f.retrbinary('RETR?%s'?%?FILE,
open(FILE,'wb').write)
except?ftplib.error_perm:????????print?'ERROR:?cannot?read?file?"%s"'?%?FILE
os.unlink(FILE)????else:????????print?'***?Download?"%s"?to?CWD'?%FILE
f.quit()if?__name__?==?'__main__':
main()
運(yùn)行結(jié)果:
ftp客戶端運(yùn)行結(jié)果:可以看出loadlin.exe文件被更新了。
3 疑問(wèn)
上面編寫的客戶端代碼對(duì)ftp.debian.org站點(diǎn)可以正常連接,為什么有的ftp服務(wù)器明明可以ping通卻無(wú)法連接?
ping ftp.python.org
然而,卻無(wú)法連接到服務(wù)器:
無(wú)法連接ftp.python.org
請(qǐng)高人指點(diǎn)!!謝謝!!
作者:rebirth_2017
鏈接:https://www.jianshu.com/p/bb8207a1ff75
總結(jié)
以上是生活随笔為你收集整理的python编写ftp客户端_用Python写FTP客户端程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 湖南,四川黄李太酸了怎么处理好吃湖南的黄
- 下一篇: websocket python爬虫_p