ScalersTalk成长会Python小组第17周学习笔记

服务器

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更新)

标签: 服务器