python 網絡編程學習: 3 網絡客戶端編程之FTP


什么是網絡客戶端?

首先,我們把因特網簡化成一個數據中心,數據交換的參與者是一個服務提供者和一個服務使用者。類似於“生產者-消費者”這里 服務器就是生產者,它提供服務,一般只有一個服務器喝多個消費者,就像我們之前看道德客戶端/服務器模型那樣。

這里主要介紹三個網際協議---FTP、NNTP和POP3

文件傳輸協議--FTP

FTP是internet上文件傳輸、軟件和源代碼下載的主要手段之一。FTP要求輸入用戶名和密碼才能訪問FTP服務器,但它也允許沒有帳號的用戶以匿名用戶登錄(當然這需要管理員設置FTP服務器允許匿名用戶登錄)。這時用戶名是匿名(anonymous),密碼是一般是用戶的電子郵件地址。

FTP工作流程如下

  1. 客戶端鏈接遠程FTP服務器
  2. 客戶端輸入用戶名和密碼
  3. 客戶端做各種文件傳輸和信息查詢
  4. 客戶端登出遠程FTP服務器,結束通訊

有時由於網絡原因 會導致事務在完成之前中斷。客戶端在超過900秒不活動后連接就會被關閉。

在底層,FTP使用TCP 而不是UDP。並且客戶端和服務器都使用兩個套接字來通訊:一個控制和命令端口(21號端口),一個數據端口(20號端口).。

FTP有兩種模式:主動和被動(Python同時支持主動被動兩種模式)。只有主動模式服務器才使用數據端口。而被動模式中服務器只告訴客戶端他的隨即端口號碼,客戶端必須主動建立數據鏈接。

 

Python 和 FTP

在使用Python的FTP支持時,需要導入ftplib模塊,並實例化一個ftplib.FTP類對象

ftplib.FTP類方法

 
方法 屬性
login([user[, passwd[, acct]]])

登錄到FTP服務器,所有參數都是可選的

pwd() 得到當前工作目錄
cwd(pathname) 把當前工作目錄設置為pathname
dir(argument[, ...[,cb]·]) 顯示參數目錄的內容,可選參數cb是一個回調函數他會被傳給retrlines()方法
nlst(argument[, ...]) 與dir 類似 但返回一個文件名列表 而不是顯示這些文件
retrlines(command[, callback]) 給定FTP命令 用於下載文本文件 可選的會小函數用於處理每一塊下載的數據(每塊默認為為8k)
retrbinary(command, callback[, maxblocksize[, rest]]) 與上一個類似 但這個指令處理二進制文件
storlines(command, file[, callback]) 給定FTP命令,用於上傳文件 要給定一個文件對象file
storbinary(command, file[, blocksize, callback, rest]) 與上一個類似 只是這個處理二進制文件 要給定文件對象 上傳塊大小默認8k
rename(fromname, toname) 修改文件名
delete(filename) 刪除遠程文件
mkd(pathname) 創建遠程目錄
rmd(dirname) 刪除遠程目錄
quit() 關閉鏈接並斷開

 

 

 

 

 

 

 

 

 

 

 

 

內容參見 http://docs.python.org/library/ftplib.html

 

Python使用FTP流程為

from ftplib import FTP
f = FTP('ftp.python.org')
f.login('anonymous','guess@who.org')
:
f.quit()

 

下面我們寫一段代碼,假設你要從mozilla網站上下載最新的

bugzilla-3.6.9-to-3.6.10-nodocs.diff.gz 代碼

代碼示例

 

#!/usr/bin/python
# -*- coding: utf-8 -*-

import ftplib
import os
import socket

HOST = 'ftp.mozilla.org'
DIRN = 'pub/mozilla.org/webtools'
FILE = 'bugzilla-3.6.7.tar.gz'


def main():
    try:
        f = ftplib.FTP(HOST)
    except (socket.error, socket.gaierror):
        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 "anonymously"'
    try:
        f.cwd(DIRN)
    except ftplib.error_perm:
        print 'ERRORL cannot CD to "%s"' % DIRN
        f.quit()
        return
    print '*** Changed to "%s" folder' % DIRN

    try:
        #傳一個回調函數給retrbinary() 它在每接收一個二進制數據時都會被調用
        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 '*** Downloaded "%s" to CWD' % FILE

    f.quit()
    return

if __name__ == '__main__':
    main()

 

 

 

運行代碼將輸出一下內容 並將

bugzilla-3.6.7.tar.gz
下載到電腦
***Connected to host "ftp.mozilla.org"
*** Logged in as "anonymously"
*** Changed to "pub/mozilla.org/webtools" folder
*** Downloaded "bugzilla-3.6.7.tar.gz" to CWD
[Finished in 11.4s]

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM