之前已经了解了TCP/IP这种低级别的协议,还有一些网络协议包括文件传输(FTP,STP)、阅读Usenet新闻组(NNTP)、电子邮件发送(SMTP)、从服务器上下载电子邮件(POP3、IMAP)等。
一、文件传输
1.文件传输网际协议
因特网中最流行的事情就是文件交换。
文件交换无处不在。有很多协议可以供因特网上传输文件使用。
最流行的有文件传输协议(File Transfer(转移) Protocol,FTP)、Unix-to-Unix复制协议(Unix-to-Unix Copy Protocol(协议),UUCP)
和网页的超文本传输协议(Hypertext(超文本) Transfer Protocol,HTTP)。
另外还有(Unix下的)远程文件复制命令rcp(以及更安全更灵活的scp和rsync)。
迄今为止,HTTP、FTP和scp/rsync还是非常流行的。HTTP主要用于网页文件的下载和访问web服务上。
它一般不要求用户输入登陆的用户名密码就可以访问服务器上的文件和服务。
HTTP文件传输请求主要是用于获取网页(文件下载)。
相对的,scp和rsync要求用户登录到服务器,否则不能上传和下载文件。
至于FTP,跟scp/rsync一样,可以上传或下载文件,还采用了Unix的多用户的概念,用户一定要输入有效的用户名和密码才能使用。不过,FTP也允许匿名登陆。
二、文件传输协议(FTP)
文件传输协议最早主要用于匿名下载公共文件,也可以用在两台电脑之间传输文件,尤其是在使用Unix系统作为文件存储系统,使用其他机器来工作的情况。
在网络流行之前,FTP就是在因特网上文件传输、软件和源代码下载的主要手段之一。
FTP要求输入用户名和密码才能访问远程的FTP服务器,但它也允许没有账号的用户以匿名用户登陆。
不过,管理员要先设置FTP服务器允许匿名用户登陆。这时,匿名用户的用户名是“匿名”(anonymous),密码一般是用户的电子邮件地址。
与特定的用户拥有特定的账户不同,这有点像把FTP公开出来让大家访问。匿名用户通过FTP协议可以使用的命令与一般的用户相比来说,限制更多。
下图展示了FTP协议的工作流程:
(1)客户端连接远程的FTP服务器;
(2)客户端输入用户名和密码(或“匿名”和电子邮件地址);
(3)客户端做各种文件传输和信息查询操作;
(4)客户端登出远程FTP服务器,结束通讯。
当然,这只是一个大致流程。有时,由于网络两边电脑的崩溃或是网络问题,会导致整个事务在完成之前被中断。
一般在客户端超过超过15分钟(900秒)不活动之后,连接就会被关闭。
在底层上,FTP只使用TCP——它不使用UDP。而且,FTP是客户端/服务器编程中很“与众不同”的例子。
客户端和服务器都使用两个套接字来通讯:一个是控制和命令端口(21号端口),另一个是数据端口(有时是20号端口)。
我们说“有时”是因为FTP有两种模式:主动和被动。
只有在主动模式服务器才使用数据端口。在服务器把29号端口设置为数据端口后,它“主动”连接客户端的数据端口。
而被动模式中,服务器只是告诉客户端它的随机端口号码,客户端必须主动建立数据连接,在这种模式下,你会看到,FTP服务器在建立数据连接时是“被动的”。
python已经支持il包括FTP在内的大多是数据网际协议。
三、python和FTP
下面会介绍如何用python写FTP客户端程序,回顾一下简要的流程:
(1)连接到服务器
(2)登陆
(3)发出服务请求(可能有返回信息)
(4)退出
在使用python的FTP支持时,你所需要做的就是导入ftplib模块,并实例化一个ftplib.FTP类的对象,所有的FTP操作(如登陆,传输文件和登出等)都要使用这个对象来完成。
1.ftplib.FTP类的方法
下面列出了一些最常用的方法。
方 法 | 描 述 |
login(user='anonymous',passwd='',acct='') | 登陆到FTP服务器,所有的参数都是可选的 |
pwd() | 得到当前工作目录 |
cwd(path) | 把当前工作目录设置为path |
dir([path[,....[,cb]]]) | 显示path目录里的内容,可选的参数cb是一个回调函数,它会被传给restrlines()方法 |
nlst([path[,....]]) | 与dir()类似,但返回一个文件名的列表,而不是显示这些文件名 |
retrlines(cmd[,cb]) | 给定FTP命令,用于下载文本文件。可选的回调函数cb用于处理文件的每一行 |
retrbinary(cmd,cb[bs=8192[,ra]]) | 与retrlines(类似),只是这个指令处理二进制文件,回调函数cb用于处理每一块(块大小默认为8K)下载的数据 |
storlines(cmd,f) | 给定FTP命令,以上传文本文件,要给定一个文件对象f |
storbinary(cmd,f[,bs=8192]) | 与storlines()类似,只是这个指令处理二进制文件,要给定一个文件对象f,上传块大小bs默认为8K |
rename(old,new) | 把远程文件old改为new |
delete(path) | 删除位于path的远程文件 |
mkd(directory) | 创建远程目录 |
rmd(directory) | 删除远程目录 |
quit() | 关闭连接并退出 |
也就是说,你不一定要使用其他的方法,因为它们或者是辅助函数,或者是管理函数,或者是被API调用的。