Crossin的编程教室

标题: 【转载】python 网络编程学习: 3 网络客户端编程之FTP [打印本页]

作者: 今天手气不错啊    时间: 2013-12-26 17:24
标题: 【转载】python 网络编程学习: 3 网络客户端编程之FTP
本帖最后由 今天手气不错啊 于 2013-12-26 17:28 编辑

原文地址http://www.cnblogs.com/cacique/archive/2012/08/24/2653686.html

什么是网络客户端?
首先,我们把因特网简化成一个数据中心,数据交换的参与者是一个服务提供者和一个服务使用者。类似于“生产者-消费者”这里 服务器就是生产者,它提供服务,一般只有一个服务器喝多个消费者,就像我们之前看道德客户端/服务器模型那样。
这里主要介绍三个网际协议---FTP、NNTP和POP3
文件传输协议--FTP
FTP是internet上文件传输、软件和源代码下载的主要手段之一。FTP要求输入用户名和密码才能访问FTP服务器,但它也允许没有帐号的用户以匿名用户登录(当然这需要管理员设置FTP服务器允许匿名用户登录)。这时用户名是匿名(anonymous),密码是一般是用户的电子邮件地址。
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流程为
  1. <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">from</span> ftplib <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="color: rgb(0, 0, 0); line-height: 1.5 !important;"> FTP
  2. f </span>= FTP(<span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">'</span><span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">ftp.python.org</span><span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">'</span><span style="color: rgb(0, 0, 0); line-height: 1.5 !important;">)
  3. f.login(</span><span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">'</span><span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">anonymous</span><span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">'</span>,<span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">'</span><span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">guess@who.org</span><span style="color: rgb(128, 0, 0); line-height: 1.5 !important;">'</span><span style="color: rgb(0, 0, 0); line-height: 1.5 !important;">)
  4. :
  5. f.quit()</span>
复制代码



作者: 今天手气不错啊    时间: 2013-12-26 17:29
下面我们写一段代码,假设你要从mozilla网站上下载最新的
bugzilla-3.6.9-to-3.6.10-nodocs.diff.gz 代码
代码示例
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-

  3. import ftplib
  4. import os
  5. import socket

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


  9. def main():
  10.     try:
  11.         f = ftplib.FTP(HOST)
  12.     except (socket.error, socket.gaierror):
  13.         print 'ERROR:cannot reach " %s"' % HOST
  14.         return
  15.     print '***Connected to host "%s"' % HOST

  16.     try:
  17.         f.login()
  18.     except ftplib.error_perm:
  19.         print 'ERROR: cannot login anonymously'
  20.         f.quit()
  21.         return
  22.     print '*** Logged in as "anonymously"'
  23.     try:
  24.         f.cwd(DIRN)
  25.     except ftplib.error_perm:
  26.         print 'ERRORL cannot CD to "%s"' % DIRN
  27.         f.quit()
  28.         return
  29.     print '*** Changed to "%s" folder' % DIRN

  30.     try:
  31.         #传一个回调函数给retrbinary() 它在每接收一个二进制数据时都会被调用
  32.         f.retrbinary('RETR %s' % FILE, open(FILE, 'wb').write)
  33.     except ftplib.error_perm:
  34.         print 'ERROR: cannot read file "%s"' % FILE
  35.         os.unlink(FILE)
  36.     else:
  37.         print '*** Downloaded "%s" to CWD' % FILE

  38.     f.quit()
  39.     return

  40. if __name__ == '__main__':
  41.     main()
复制代码
运行代码将输出一下内容 并将
bugzilla-3.6.7.tar.gz
下载到电脑
  1. ***Connected to host "ftp.mozilla.org"
  2. *** Logged in as "anonymously"
  3. *** Changed to "pub/mozilla.org/webtools" folder
  4. *** Downloaded "bugzilla-3.6.7.tar.gz" to CWD
  5. [Finished in 11.4s]
复制代码
作者:GoodSpeed Cheng
出处:http://www.cnblogs.com/cacique/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者: 今天手气不错啊    时间: 2013-12-28 12:09
经验证,发现这个bugzilla-3.6.7.tar.gz文件也已不存在,改成bugzilla-4.0-to-4.0.10-nodocs.diff.gz或者先用ftp命令得到一个file list,然后在下载。





欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5