來源:Rebirth_2017 發(fā)布時(shí)間:2018-11-03 15:48:45 閱讀量:1486
0 前言:
ftp客戶端相信大家都用過,那么我們?yōu)槭裁催€要用Python寫ftp客戶端呢?
我想有兩個(gè)原因:
一是寫出更好的ftp客戶端應(yīng)用程序,方便大家使用;
二是定制一些特殊服務(wù),例如每天定時(shí)下載/上傳某文件;
我還沒能力也沒時(shí)間寫出ftp客戶端應(yīng)用程序,前期先分析一下python寫ftp客戶端的核心部分,即實(shí)現(xiàn)上傳和下載的關(guān)鍵部分。
首先看一下ftp服務(wù)器/客戶端架構(gòu):
1 FTP服務(wù)器/客戶端
上圖展示了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()
1
2
3
4
5
當(dāng)然,這只是一般情況下的流程。有時(shí),由于網(wǎng)絡(luò)兩邊計(jì)算機(jī)的崩潰或網(wǎng)絡(luò)的問題,會(huì)導(dǎo)致整個(gè)傳輸在完成之前就中斷。
如果客戶端超過15 分鐘(900 秒)還沒有響應(yīng),F(xiàn)TP 連接就會(huì)超時(shí)并中斷。
在底層,F(xiàn)TP 只使用TCP,而不使用UDP。
另外,可以將FTP 看作客戶端/服務(wù)器編程中的特殊情況。因?yàn)檫@里的客戶端和服務(wù)器都使用兩個(gè)套接字來通信:
一個(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-8
import 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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
運(yùn)行結(jié)果:
3 疑問
上面編寫的客戶端代碼對ftp.debian.org站點(diǎn)可以正常連接,為什么有的ftp服務(wù)器明明可以ping通卻無法連接?
然而,卻無法連接到服務(wù)器:
---------------------
作者:Rebirth_2017
來源:CSDN
原文:https://blog.csdn.net/zhou8201/article/details/71526455
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!