1.什么是因特网客户端?
因特网可以简化成一个数据交换中心,数据交换的参与者是一个服务提供者和一个服务的使用者。服务器就是生产者,它提供服务,一般只有一个服务器(进程或主机等),和多个消费者,就像我们之前看的客户端/服务器模型那样。
2. 文件传输
因特网中最流行的事情就是文件的交换。最流行的有文件传输协议(FTP),Unix-to-Unix 复制协议(UUCP),以及网页的超文本传输协议(HTTP)。另外,还有(Unix 下的)远程文件复制指令rcp(以及更安全,更灵活的scp 和rsync)。
HTTP 主要用于网页文件的下载和访问Web服务上。它一般不要求用户输入登录的用户名密码就可以访问服务器上的文件和服务。HTTP 文件传输请求主要是用于获取网页(文件下载)。相对的,scp 和rsync 要求用户登录到服务器,否则不能上传或下载文件。至于FTP,跟scp/rsync一样,可以上传或下载文件,还采用了Unix 的多用户的概念,用户一定要输入有效的用户名和密码才能使用。不过,FTP 也允许匿名登录。
FTP 要求输入用户名和密码才能访问远程的FTP 服务器,但它也允许没有帐号的用户以匿名用户登录。不过,管理员要先设置FTP 服务器允许匿名用户登录。
图展示了FTP协议,其工作流程如下:
1. 客户端连接远程的FTP 服务器
2. 客户端输入用户名和密码(或“anonymous”和e-mail 地址)
3. 客户端做各种文件传输和信息查询操作
4. 客户端登出远程FTP 服务器,结束通讯
一般,在客户端超过15 分钟(900 秒)不活动之后,连接就会被关闭。在底层上,FTP 只使用TCP而不使用UDP。客户端和服务器都使用两个套接字来通讯:一个是控制和命令端口(21 号端口),另一个是数据端口(有时是20 号端口)。
FTP 有两种模式:主动和被动。只有在主动模式服务器才使用数据端口。在服务器把20 号端口设置为数据端口后,它“主动”连接客户端的数据端口。而被动模式中,服务器只是告诉客户端它的随机端口的号码,客户端必须主动建立数据连接。在这种模式下,FTP 服务器在建立数据连接时是“被动”的。
在使用Python 的FTP 支持时,你所需要做的就是导入ftplib 模块,并实例化一个ftplib.FTP类对象。所有的FTP 操作(如登录,传输文件和登出等)都要使用这个对象来完成。
FTP 对象的方法 | |
方法 | 描述 |
login(user='anonymous',passwd='', acct='') |
登录到FTP 服务器,所有的参数都是可选的 |
pwd() | 得到当前工作目录 |
cwd(path) | 把当前工作目录设置为path |
dir([path[,...[,cb]]) | 显示path 目录里的内容,可选的参数cb 是一个回调函数,它会被传给retrlines()方法 |
nlst([path[,...]) | 与dir()类似,但返回一个文件名的列表,而不是显示这些文件名 |
retrlines(cmd [, cb]) | 给定FTP 命令(如“RETR filename”),用于下载文本文件。可选的回调函数cb 用于处理文件的每一行 |
retrbinary(cmd, cb[,bs=8192[, ra]]) |
与retrlines()类似,只是这个指令处理二进制文件。回调函数cb 用于处理每一块(块大小默认为8K)下载的数据。 |
storlines(cmd, f) | 给定FTP 命令(如“STOR filename”),以上传文本文件。要给定一个文件对象f |
storbinary(cmd, f[,bs=8192]) | 与storlines()类似,只是这个指令处理二进制文件。要给定一个文件对象f,上传块大小bs 默认为8Kbs=8192]) |
rename(old, new) | 把远程文件old 改名为new |
delete(path) | 删除位于path 的远程文件 |
mkd(directory) | 创建远程目录 |
rmd(directory) | 删除远程目录 |
quit() | 关闭连接并退出 |
在一般的FTP 通讯中,要使用到的指令有login(), cwd(), dir(), pwd(), stor*(), retr*()和quit()。Python 同时支持主动和被动模式。注意,在Python2.0 及以前版本中,被动模式支持默认是关闭的,在Python2.1 及以后版本中,默认是打开的。
3. 网络新闻
供用户在新闻组中下载或发表帖子的方法叫网络新闻传输协议(NNTP)。NNTP 只使用一个标准端口119 来做通讯。你给服务器一个请求,它做相应的反馈。
在使用Python 的NNTP支持时,需导入库nntplib,并且对类nntplib.NNTP进行实例化。一般来说,在你登录完成后,你要调用group()方法来选择一个感兴趣的新闻组。方法返回服务器的返回信息,文章的数量,第一个和最后一个文章的ID,以及组的名字。
NNTP 对象的方法 | |
方法 | 描述 |
group(name) | 选择一个组的名字,返回一个元组(rsp,ct,fst,lst,group):服务器的返回信息,文章的数量,第一个和最后一个文章的号码以及组名,所有数据都是字符串。(返回的group 与我们传进去的name 应该是相同的) |
xhdr(hdr, artrg, |
返回文章范围artrg('头-尾'的格式)内文章hdr 头的列表,或输出到文件ofile 中 |
body(id[, |
给定文章的id,id 可以是消息的ID(放在尖括号里),或一个文章号(是一个字符串),返回一个元组(rsp, anum, mid,data): 服务器的返回信息,文章号(是一个字符串),消息的ID(放在尖括号里),和文章所有行的列表或把数据输出到文件ofile 中。 |
head(id) | 与body()相似,只是返回的元组中那个行的列表中只包含了文章的标题。 |
article(id) | 也跟body()一样,只是返回的元组中那个行的列表中包含了文章的标题和内容。 |
stat(id) |
让文章的“指针”指向id(同上,是一个消息的ID 或是文章的号码)。返回一个跟body 一样的元组(rsp, anum, mid),但不包含文章的数据。 |
next() |
用法和stat()类似,把文章指针移到下一篇文章,返回与stat()相似的元组 |
last() |
用法和stat()类似,把文章指针移到最后一篇文章,返回与stat()相似的元组 |
post(ufile) |
上传ufile 文件对象里的内容(使用ufile.readline()),并在当前新闻组发表。 |
quit() | 关闭连接,然后退出 |
4. 电子邮件
对于一般用户来说,一说起e-mail 就会让我们想到它的内容,不管它是一封真的邮件还是一封不请自来的商业广告(即spam,垃圾邮件),都应该有内容。不过,RFC 规定,邮件体是可选的,只有邮件头是必要的。
e-mail 系统最主要的组件是消息传输代理(MTA)。这是一个在邮件交换主机上运行的一个服务器程序,它负责邮件的路由,队列和发送工作。它们就是邮件从源主机到目的主机所要经过的跳板。所以也被称为是“信息传输”的“代理”。要让所有这些工作起来,MTA 要知道两件事情:1) 如何找到消息应该去的下一台MTA 2) 如何与另一台MTA 通讯。第一件事由域名服务(DNS)来查找目的域名的MX(邮件交换Mail eXchange)来完成。这对于最后的收件人是不必要的,但对其它的跳板来说,则是必要的。对于第二件事,MTA怎么把消息转给其它的MTA 呢?
要能发送e-mail,你的邮件客户端一定要连接到一个MTA,它们靠某种协议进行通讯。MTA 之间通讯所使用的协议叫消息传输系统(MTS)。只有两个MTA 都使用这个协议时,才能进行通讯。现代e-mail 的基础之一,简单邮件传输协议(SMTP)于1982 年出现了。SMTP 是在因特网上MTA 之间用于消息交换的最常用的MTS。它被MTA 用来把e-mail 从一台主机传送到另一台主机。在你发e-mail 的时候,你必须要连接到一个外部的SMTP 服务器,这时,你的邮件程序是一个SMTP 客户端。你的SMTP 服务器也因此成为了你的消息的第一个跳板。对大多数e-mail 发送程序来说,只有两个方法是必须的:sendmail()和quit()。
SMTP 对象的方法 | |
Sendmail(from,to,msg[,mopts,ropts]) | 把msg 从from 发送给to(列表或元组)。ESMTP 设置(mopts)和收件人设置(ropts)为可选。 |
quit() | 关闭连接,然后退出 |
login(user, passwd)(只在有SMTP-AUTH 时使用。) | 使用user 用户和passwd 密码登录到SMTP 服务器 |
POP3 对象的常用方法 | |
方法 | 描述 |
user(login) | 发送用户名login 到服务器,并等候服务器的正在等待用户密码的返回信息 |
pass_(passwd) | 发送密码passwd(在使用user()登录之后使用)。如果登录失败,引发一个异常 |
stat() | 返回邮件的状态,一个长度为2 的元组(msg_ct, mbox_siz):消息的数量和消息的总大小也即字节数 |
list([msgnum]) |
stat()的扩展,从服务器返回长度为3 的元组的消息列表(rsp, msg_list,rsp_siz):服务器的返回信息,消息的列表,返回信息的大小。如果给了msgnum 的话,只返回指定消息的数据。msg_list的格式:[‘msgnum msgsiz’,…],msgnum 和msgsiz分别是每个消息的编号和消息的大小。 |
retr(msgnum) | 从服务器中得到消息msgnum,并设置其“已读”标志。返回一个长度为3 的元组(rsp, msglines, msgsiz):服务器的返回信息,消息msgnum的所有行,消息的字节数 |
dele(msgnum) | 把消息msgnum 标记为删除,大多数服务器在调用quit()后执行删除操作。 |
quit() | 登出,保存修改(如,执行“已读”和“删除”标记等),解锁邮箱,结束连接,然后退出 |
E-Mail 相关模块 | |
模块/包 | 描述 |
e-mail 处理的包 (也支持MIME) | |
rfc822 | RFC2822 邮件头解析器 |
smtpd | SMTP 服务器 |
base64 | Base 16,32,和64 数据编码(RFC 3548) |
mhlib | 处理MH 文件夹和信息的类 |
mailbox | 支持mailbox 文件格式解析的类 |
mailcap | “mailcap” 文件的处理模块 |
mimetools | (不建议使用)MIME 信息解析工具(使用上面的email) |
mimetypes | 在文件名或URL 到相关的MIME 类型之间转换的模块 |
MimeWriter | (不建议使用)MIME 信息处理模块(使用上面的email) |
mimify | (不建议使用)信息的MIME 处理工具(使用上面的email) |
binascii | 二进制和ASCII 转换 |
binhex | Binhex4 编码和解码支持 |
因特网协议相关的模块 | |
模块 | 描述 |
ftplib | FTP 协议客户端 |
gopherlib | Gopher 协议客户端 |
httplib | HTTP 和HTTPS 协议客户端 |
imaplib | IMAP4 协议客户端 |
nntplib | NNTP protocol client |
nntplib | NNTP 协议客户端 |
poplib | POP3 协议客户端 |
smtplib | SMTP 协议客户端 |
telnetlib | Telnet 协议客户端类 |