亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

用Python寫FTP客戶端程序

來源: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)載請附上博文鏈接!


標(biāo)簽: 服務(wù)器搭建
分享:
評論:
你還沒有登錄,請先