Scalers点评:在2022年,ScalersTalk成长会完成Python小组完成了《Python核心编程》第1轮的学习。到2022年,我们开始第二轮的学习,并且将重点放在章节的习题上。Python小组是成长会内部小组,如果你想和我们一起学习Python,你需要是成长会成员,并且完成相关进群任务。
我们的节奏是行动是一周一章学到位,章节习题都会一个一个过。通过到位地执行,达到实质性的提升。
往期日志:
本周学习情况
本周(20220516-20220522)学习第十七章,章节内容为《网络客户端编程》。本周复盘主持人为杨芃。
本章主要内容
本章主要讲述了因特网客户端、文件传输、网络新闻、电子邮件的概念,介绍了相关的python模块,以及用python建立FTP客户端、NNTP客户端、发送电子邮件、接收电子邮件。
本章主要知识点
1.因特网客户端
“因特网”→数据交换中心
服务提供者和服务使用者的数据交换
“生产者-消费者”OSI模型(即开放式通信系统互联参考模型),将网络的不同功能划分为7层。
七层网络模型
对等实体之间虚拟通信,每层之间都是往下走到物理层进行数据传输,再到另外一台电脑的对等层。
应用层 :远程登录协议Talnet、文件传输协议FTP、超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP、邮局协议POP3等。
传输层:传输控制协议TCP、用户数据报协议UDP等。
网络层: 网际协议IP、Internet互联网控制报文协议ICMP、Internet组管理协议ICMP 。
2.文件传输
文件传输协议(FTP)
FTP要求输入用户名和密码才能访问远程FTP服务器,管理员也可以设置FTP服务器匿名访问。
匿名用户名:anonymous ,密码:一般是用户的电子邮箱地址。
底层上FTP使用TCP。
客户端和服务器都使用两个套接字通信:控制和命令端口(21号端口),数据端口有时是20号端口。
两种连接模式,主动模式:使用数据端口,服务器设置好20号数据端口,它“主动”连接客户端的数据端口;被动模式:服务器只告诉客户端随机端口号码,客户端必须主动建立数据连接。
python写FTP客户端
(伪代码)
from ftplib import FTP #
导入ftplib模块
f = FTP(‘ftp.python.org’) #
实例化一个ftplib.FTP类对象
f.login(‘anonymous’,’guess@who.org’) #
登录
… # 发出请求/接收
f.quit #
关闭客户端
ftplib.FTP类方法
一些典型的FTP客户端类型包括:
命令行客户端程序:你可以使用一些FTP 文件传输工具如/bin/ftp或NcFTP,它们允许用户在命令行交互式的参与到FTP通讯中来。
GUI客户端程序:与命令行客户端程序相似,只是它是一个GUI程序。 如WsFTP和Fetch等。
网页浏览器:在使用HTTP之外,大多数网页浏览器(也是一个客户端)可以进行FTP通讯。 URL/URI 的第一部分就用来表示所使用的协议, “ftp://blahblah.”( “ftp://” 后面的 “blahblah”可以展开为“host/path?attributes”。)如果要登录,可以把登录信息(以明文方式)放在URL里:“ftp://user:passwd@host/path?ttr1=val1&attr2=val2. . .”。
定制程序:你自己写的用于FTP文件传输的程序。由于程序用于特殊目的,一般这种程序都 不允许用户与服务器接触。
3.网络新闻
Usenet 与新闻组
Usenet 新闻系统:全球存档的“电子公告版”
整个系统由大量计算机组成的全球网络,计算机之间共享Usenet上的帖子
每个系统都有一个“订阅”的新闻组列表,只接收它感兴趣的新闻组里的帖子
可以设置要求输入用户密码,可以设置只需上传或只许下载
网络新闻传输协议(NNTP)
只用端口199做通讯
Python和NNTP
连接服务器
登录(可选)
发出请求
退出
伪代码如下
from nntplib import NNTP
n = NNTP(‘your.nntp.server’)
r,c,f,l,g = n.group(‘comp.lang.python’)
n.quit
n = NNTP(‘your.nntp.server’)
创建NNTP客户端可用 nntplib.NNTP类的方法
group(name):输入一个组名,返回一个五元组(rsp服务器的返回信息,ct文章的数量,fst第一个,lst最后一个文章的号码 ,group组名)字符串形式。( group组名与输入的name应该是相同的)
body(id[,ofile]):给定文章的id,id 可以是消息的 ID(放在尖括号里)或一个文章号(是一个字符串),返回一个四元组(rsp服务器的返回信息, anum文章号, mid消息的ID,data文章所有行的列表),或把数据输出到文件ofile中。
head(id):与body相似,只是返回的元组中那个行的列表中只包含了文章的标题。
post(ufile):上传ufile文件对象里的内容(使用ufile.readline),并在当前新闻组发表。
4.电子邮件
RFC2822,定义“消息由头域(合起来叫消息头)以及后面可选的消息体组成”RFC规定,邮件体是可选的,只有邮件头是必要的。
电子邮件系统
从发送主机和目的之际之间,可能有多台“跳板”主机。
MTA ‘代理’
MTA即消息传输代理,在邮件交换主机上运行的一个服务器程序,负责邮件的路由、队列和发送工作,充当跳板作用。
如何找到下一台MTA
通过域名服务( domain name service DNS )查找目的域名的 邮件交换(Mail eXchange MX)。
如何与另一台通讯
MTA之间采用的通信协议叫消息传输系统( MTS)
简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)是因特网上最常用的MTS它被MTA用来把e-mail从一台主机 传送到另一台主机。在你发 e-mail 的时候,你必须要连接到一个外部的 SMTP 服务器,这时,你的 邮件程序是一个SMTP客户端。你的SMTP服务器也因此成为了你的消息的第一个跳板。
smtplib.SMTP类实例化
只在服务器打开SMTP认证的时候(SMTP-AUTH),需要登陆
只需一个端口25
1.连接服务器
2.登录(可选)
3.发送请求
4.退出
下面是一些Python的伪代码
from smtplib import SMTP
n = SMTP(‘smtp.yourdomain.com’)
…
n.quit
smtlib.SMTP类方法
smail(from,to,msg[,mopts,ropts]) :把msg从from发送给to(列表或元组)ESMTP设置(mopts)和收件人设置(ropts)为可选。
smail的所有参数都要遵循 RFC 2822,即e-mail地址必须要有正确的格式,消息体要有正确的前导头,前导头后面是两个回车和换行(\r\n)对。
注意, 实际的消息体不是必要的。 根据RFC 2822, “唯一要求的头信息只有发送日期和发送地址” , 即“Date:”和“From:” :(MAIL FROM, RCPT TO, DATA)
login(user,passwd)使用user用户和passwd密码登录到SMTP服务器
quit关闭连接,然后退出
接收电子邮件
家用电脑中运行的应用程序叫做邮件用户代理(mail user agent , MUA)
POP和IMAP
“POP邮局协议”:让用户的工作站访问邮箱服务器里的邮件,POP3最新版
交互式邮件访问协议IMAP
IMAP4rev1
Python和POP3
poplib.POP3类实例化
连接到服务器
登录
发出服务请求
退出
Python的伪代码如下:
from poplib import POP3
p = POP3(‘pop.python.is.cool’)
p.user(…)
p.pass_(…)
…
p.quit
poplib.POP3类方法
user(login) :发送用户名login到服务器,并等候服务器的正在等待用户密码的返回信息。
pass_(passwd:) 发送密码 passwd(在使用 user()登录之后使用)。如果登录失败,引发一个异常。
stat:返回邮件的状态,一个长度为 2 的元组(msg_ct, mbox_siz):消息的数量和消息的总大小也即字节数。
list([msgnum]): stat的扩展,从服务器返回长度为3的元组的消息列表 (rsp,msg_list,rsp_siz):服务器的返回信息,消息的列表,返回信息的大小。如果给 了msgnum的话,只返回指定消息的数据。
retr(msgnum): 从服务器中得到消息msgnum,并设置其“已读”标志。返回一个长度为 3 的元组(rsp, msglines, msgsiz):服务器的返回信息,消息msgnum的所有行,消息的字节数。
dele(msgnum): 把消息msgnum标记为删除,大多数服务器在调用quit后执行删除操作。
quit:登出,保存修改(如,执行“已读”和“删除”标记等),解锁邮箱,结束连接,然后退出。
小结
ScalersTalkID:scalerstalk
本微信作者Scalers,游走在口译世界的IT从业者。微信ScalersTalk,微博@Scalers,网站ScalersTalk.com,口译100小时训练计划群C 456036104
成长会是由Scalers发起的面向成长、实践行动,且凝聚了来自全球各地各行各业从业者的社群。有意入会者请和Scalers直接联系,我和其他会员会和你直接交流关于成长行动等各方面的经验教训。2022年成长会持续招募中,参见做能说会写的持续行动者:ScalersTalk成长会2022年会员计划介绍(2022.3更新)