什么是網絡客戶端?
首先,我們把因特網簡化成一個數據中心,數據交換的參與者是一個服務提供者和一個服務使用者。類似於“生產者-消費者”這里 服務器就是生產者,它提供服務,一般只有一個服務器喝多個消費者,就像我們之前看道德客戶端/服務器模型那樣。
這里主要介紹三個網際協議---FTP、NNTP和POP3
文件傳輸協議--FTP
FTP是internet上文件傳輸、軟件和源代碼下載的主要手段之一。FTP要求輸入用戶名和密碼才能訪問FTP服務器,但它也允許沒有帳號的用戶以匿名用戶登錄(當然這需要管理員設置FTP服務器允許匿名用戶登錄)。這時用戶名是匿名(anonymous),密碼是一般是用戶的電子郵件地址。
FTP工作流程如下
- 客戶端鏈接遠程FTP服務器
- 客戶端輸入用戶名和密碼
- 客戶端做各種文件傳輸和信息查詢
- 客戶端登出遠程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]