第三章因特网客户端编程

  • 3.1 因特网客户端简介
    • 1)因特网客户端是什么?
      • 用来传输数据的地方,数据在服务提供者和服务使用者之间传输
    • 2)“生产者-消费者”的概念
      • 一般用途:描述操作系统方面的内容
      • 本章解释:
        • 服务器:生产者,提供服务
        • 客户端:消费者,使用服务
        • 对特定的服务,一般只有一个服务器(即进程/主机等),但有多个消费者
    • 3)本章目的
      • 介绍多个因特网协议。
    • 3.2 文件传输
    • 3.2.1 文件传输因特网协议
      • 用于在因特网上传输文件的协议
        • FTP:文件传输协议
          • 上传或下载文件,需要输入有效的用户名和密码,但也允许匿名登录。
          • 多用户概念(UNIX)
          • UUCP:UNIX到UNIX的复制协议
          • HTTP:用于web的超文本传输协议
            • 基于web的文件下载以及访问web服务
            • 大部分http文件传输请求都用于获取网页(即将网页文件下载到本地)
            • 一般客户端无需登录就可以访问服务器上的文件和服务
          • rcp:UNIX下的远程文件复制命令(以及更安全、更灵活的scp和rsync)
            • scp和rsync需要用户登陆到服务器主机,在传输文件之前必须验证客户端身份,否则无法上传或者下载文件
    • 3.2.2 文件传输协议FTP
      • 1)用途
        • 匿名下载公共文件
        • 在两台计算机之间传输文件(特别在使用Windows工作,文件存储系统使用UNIX的情况下)
      • 2)匿名登录和用户名密码登录的区别
        • 匿名登录:
          • 用户名:anonymous
          • 密码:用户的电子邮件地址
          • 特点:公开某些目录让大家共同访问
          • 缺陷:与登录用户相比只能使用有限的几个FTP命令
          • 限制:管理员要先设置FTP服务器以允许匿名登录
        • 用户名密码登录
          • 特点:
            • 可通过FTP向特定登录用户传输文件
            • 可使用的FTP命令更多
      • 3)FTP的工作流程
          • ①客户端连接远程主机上的FTP服务器
          • ②客户端输入用户名和密码(或“anonymous”和电子邮件地址)
          • ③客户端进行各种文件传输和信息查询操作
          • ④客户端从远程FTP服务器退出,结束传输
          • ⑤中断的情况
            • 1)网络两边计算机崩溃——传输完成前中断
            • 2)客户端超过15min(900s)没响应,FTP连接超时中断
      • 4)FTP连接的具体细节
        • 1)在底层,FTP只使用TCP不使用UDP

        • 2)FTP的客户端和服务器使用两个套接字通信:

          • 21号端口:控制和命令端口

          • 20号端口:数据端口

        • 3)FTP的两种模式

          • 主动:

            • 只有在主动模式下,服务器才使用数据端口

            • 即服务器主动连接客户端的数据端口

          • 被动:

            • 服务器只是告诉客户端随机的数据端口号

            • 客户端必须主动建立数据连接

    • 3.2.3 python和FTP
      • 1)流程
        • ①连接到服务器
        • ②登录
        • ③发出服务请求(希望得到响应)
        • ④退出
      • 2)相关模块
        • ①导入ftplib模块
        • ②实例化一个ftplib.FTP的类对象
        • ③所有得FTP操作(登录、传输文件、注销)都要使用这个对象完成
    • 3.2.4 ftplib.FTP
      • 1)表3-1 FTP对象的方法
      • 2)在一般的FTP事务中,常用到的:login(),cwd(),dir(),pwd(),stor*(),retr*()和quit()
    • 3.2.5 交互式FTP示例
    • 3.2.6 客户端FTP程序示例
      • P79示例3-1
    • 3.2.7 FTP的其他内容
      • 1)主动模式和被动模式
        • python2.0以前的版本中有被动模式默认关闭
        • python2.1以后的版本中,默认打开
      • 2)典型的FTP客户端
        • 命令行客户端程序
        • GUI客户端程序
          • 工具包:Tk、wxWidgets、GTK、Qt、MFC甚至Swing(需要导入Python或Jython模块)来创建
        • web浏览器
          • urllib模块解析
        • 自定义应用程序
  • 3.3 网络新闻
    • 3.3.1 Usenet与新闻组
      • 1)是什么
        • Usenet新闻系统是一个全球存档的“电子公告板”
        2)系统特点
        • 大量计算机组成
        • 计算机之间共享Usenet上的帖子
        • 一个用户发帖,所有相连计算机均可接收
        • 帖子在Usenet上存活时间有限
        • 每个系统设置已“订阅”的新闻组列表——就像哔站的关注频道一样
        • 内容由提供者安排、服务公开、特定服务特定用户(VIP)、可设置只能上传/下载
        3)使用技术
        • 老版本UUCP
        • 新版本TCP/IP
    • 3.3.2 网络新闻传输协议
      • 协议特点
        • 客户端/服务器架构
        • 只使用一个标准端口119进行通信
          • FTP中,登录、传输数据和控制需要使用不同的端口
        • 用户发一个请求,服务器就响应一次
    • 3.3.3 Python个NNTP
      • 1)用到的库和类
        • 库:nntplib库
        • 类:nntplib.NNTP类(需要实例化)
      • 2)操作流程
        • ①连接到服务器
        • ②登录(根据需要)
        • ③发出服务请求
        • ④退出
    • 3.3.4 nntplib.NNTP类方法
      • P83页表3-2
    • 3.3.5 交互式NNTP示例
    • 3.3.6 客户端程序NNTP示例
  • 3.4 电子邮件
    • 3.4.0 概述
      • 1)电子邮件的定义
        • RFC2822:(电子邮件)消息由头字段(统称消息标题)以及后面可选的正文组成
        • 邮件可以没有正文,但一定要有标题
    • 3.4.1 电子邮件系统组成和协议
      • 1)出现时间
        • 在因特网诞生之前出现(不同主机用户之间交换消息——用户使用同一台计算机,所以没有涉及网络
        • 网络出现后(不同主机之间交换消息)
      • 2)电子邮件怎么工作
        • 发送计算机
        • 中间主机(跳板)
        • 接收计算机
      • 3)电子邮件系统的各组件
        • 1)消息传输代理(MTA)
          • 是什么:在邮件交换主机上运行的服务器进程
          • 做什么:邮件的路由、队列处理和发送工作
          • 特点:它就是从发送主机到接收主机所要经过的主机和跳板
          • 需要怎么做:
            • ①要知道如何找到消息应该到达的下一台MTA
              • 由域名服务DNS来查找目的域名的MX(Mail eXchange,邮件交换)来完成
            • ②要知道如何与另一台MTA通信
              • MTA靠某种协议进行通信
                • 只有两个MTA都使用同一个协议时,才能进行通信
                • MTA之间通过消息传输系统(MTS)互相通信
    • 3.4.2 发送电子邮件
      • 1)SMTP、ESMTP、LMTP
        • SMTP:
          • 简单邮件传输协议
        • ESMTP
          • SMTP的基础上增加扩展服务
        • LMTP
          • 本地邮件传输协议
          • 基于SMTP、ESMTP
            • SMTP需要有一个邮件队列,会增加额外的存储和管理工作
            • LMTP移除了对邮件队列的需求,提供了更轻量级的系统,但邮件需要立刻发送
      • 2)MTA
        • 开源MTA:Sendmail、Posrfix、Exim、qmail
        • 商业MTA:Microsoft Exchange、Lotsus Notes Domino Mail Server
        • SMTP是在因特网上的MTA之间信息交换的最常用MTSMTA
    • 3.4.3 python和SMTP
      • 1)相关模块和类
        • smtplib模块
        • smtplib.SMTP类(需要实例化)
      • 2)流程
        • ①连接到服务器
        • ②登录(根据需要)
          • 只有在服务器启动了STMP身份验证(SMTP-AUTH)时才要登录
        • ③发出服务请求
          • STMP通信时只要一个端口
        • ④退出
    • 3.4.4 smtplib.SMTP类方法
      • 1)另外两个类
        • SMTP_SSL:类似SMTP,通过加密的套接字通信循环可以作为SMTP/TLS的替代品
        • LMTP:实现了LMTP(本地邮件传输协议)
      • 2)SMTP客户端所需要的方法
        • sendmail(from,to,msg[,mopts,ropts])
        • quit()
        • 其他见P93表3-3
    • 3.4.5 交互式SMTP示例
    • 3.4.6 SMTP的其他内容
      • 1)SMTP协议定义/规范:RFC 5321
      • 2)如何正确设定因特网地址的格式和电子邮件消息——查看因特网消息格式规范RFC5322
      • 3)python对SMTP模块的支持
    • 3.4.7 接收电子邮件
      • MUA(邮件用户代理)
        • 定义:在家用电脑中运行的应用程序
        • 功能:能够周期性的把邮件下载到本地计算机,以供离线使用
        • 要求:MUA也必须能发送邮件
          • 即发邮件的时候,应用程序要能直接使用SMTP与MTA通信
    • 3.4.8 POP和IMAP
      • 1)POP协议
        • 名称:邮局协议(post office protocal)
        • 功能:下载邮件
        • 目的:让用户的工作站可以访问邮箱服务器里的邮件,并在工作站中,通过SMTP将邮件发送到邮件服务器
        • 缺点:POP无法很好的应对多邮件客户端
      • 2)IMAP协议
        • 名称:因特网消息访问协议(internet message access protocol)
          • 因特网邮件访问协议
          • 交互式邮件访问协议
          • 临时邮件访问协议
        • 目的:提供比POP更完整的解决方案
        • 特点:可适用于用户在不同设备上使用电子邮件的场景
        • 当前版本2003:IMAP4rev1
    • 3.4.9 python和POP3
      • 1)导入模块
        • 模块:poplib
        • 类:poplib.POP3
      • 2)流程
        • ①连接到服务器
        • ②登录
        • ③发出服务请求
        • ④退出
      • 3)邮件传输过程图解
    • 3.4.10 交互式POP3示例
    • 3.4.11 poplib.POP3类方法
      • 1)user()方法
        • 像服务器发送用户名,还会等待并显示服务器的响应,表示服务器正在等待输入该用户的密码
      • 2)pass()方法
        • 在用户使用user()登录后,发送passwd。
        • 验证失败:抛出poplib.error_proto异常
        • 验证成功:得到一个以"+"号开头的应答消息,然后锁定该邮箱,直到调用quit()方法
      • 3)list()方法
        • 从服务器返回以三元组表示的整个消息列表(rsp,msg_list,rsp_siz),分别为服务器的响应、消息列表、返回消息的大小
        • msg_list的格式为[‘msgnum msgsiz’,...],分别表示每个消息的编号和消息的大小
      • 4)其他方法
        • P98表3-4
    • 3.4.12 客户端程序SMTP和POP3示例
      • P98页示例3-3
    • 3.4.13 python和IMAP4
      • 1)相关模块
        • 模块:imaplib
        • 类:imaplib.IMAP4
      • 2)流程:
        • 连接服务器-登录-发出服务请求-退出
      • 3)imaplib模块中定义的类
        • IMAP4、IMAP_SSL、IMAP4_stream——可以用来连接任何兼容IMAP4的服务器
        • IMAP4_stream——可以通过类似文件的对象接口与IMAP4服务器交互
    • 3.4.14交互式IMAP4示例
    • 3.4.15 imaplib.IMAP4类中的常用方法
      • P101表3-5
  • 3.5 实战
    • 3.5.0 关于电子邮件实战的总结
      • 1)一封电子邮件的旅程
        • 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人
      • 2)要编写程序来发送和接收邮件,本质上就是:
        • 编写MUA把邮件发到MTA——SMTP
        • 编写MUA从MDA上收邮件——POP3和IMAP4
      • 3)收邮件
        • 第一步:用poplib把邮件的原始文本下载到本地;
        • 第二部:用email解析原始文本,还原为邮件对象。
    • 3.5.1 生成电子邮件
      • 1)内容扩展
        • MIME(邮件消息扩展格式):用来识别较长消息的不同部分
        • email包:
          • 适合处理并管理整个电子邮件消息的MIME部分
          • 它有多个组件,分别用来解析和生成电子邮件
        • 本节使用:
          • email包和smtplib包
      • 2)生成电子邮件示例
        • P103页3-4
    • 3.5.2 解析电子邮件
      • 1)用到的工具
        • email.message_from_string()函数:用来解析消息
        • message.walk():遍历消息附件
        • message.getpayload()方法:从消息正文中获取特定的部分。通常参数decode会被设为True,表示邮件正文根据每个Content-Transfer-Encoding头解码
      • 2)典型代码模式
        • P105页
    • 3.5.3 基于web的云电子邮件服务
      • 1)通用电子邮件服务——来自ISP
        • 举例:SMTP、POP、IMAP
        • 特点:需要每月支付使用因特网服务
      • 2)基于web的公开电子邮件服务
        • 举例:Yahoo!Mail和Google的Gmail服务
        • 特点:SaaS(Software as a Serveice,软件即服务)类型的云服务
          • 无需每月支付费用
          • 广告费
            • Gmail:
              • 使用算法扫描电子邮件消息,对内容进行评价,然后通过优秀的机器学习算法来精准的投放广告
              • 特点:更加吸引用户、纯文本、电子邮件消息面板右边
              • Yahoo!
                • 用图片的方式投放广告,这些图片会被嵌入到web应用中
                • 特点:
                  • 不精确,收益少
                  • 有些服务需要付费订阅,这样才能下载电子邮件
                  • Yahoo!不想用户很方便的就移动他们的电子邮件
    • 3.5.4 最佳实践:安全、重构
      • 1)代码重构的关注点
        • ①在实际开发环境中,web上的连接需要加密,相应的代码中使用的协议也要加密
          • IMAP4->IMAP4_SSL
          • POP3->POP3_SSL
          • SMTP->SMTP_SSL
        • ②不能外代码中直接用纯文本保存登录名和密码
          • 登录名和密码的获取方式:
            • 安全的数据库中获取
            • 编译后的字节码文件获取(.pyc或.pyo文件)
            • 从公司内联网中的服务器代理获取
        • ③邮件消息头和正文的表示:用列表替代字符串
          • 因为实际中,消息正文由应用生成或控制,不是硬编码的字符串
          • 使用列表可以方便增删数据
        • ④邮件的收件人可能不止一个:to的变量类型也改成了列表
        • ⑤小知识点:调用timeit可以知道两种代码(完成相同工作)哪个效率更高
      • 2)实际代码在P106页
    • 3.5.5 Yahoo!Mail
      • 1)代码在P108页
      • 2)代码执行的前提条件:
        • 需要一个Yahoo!Mail Plus账号
        • 付费用户且python版本在2.6.3及以后(解决办法:使用异常抛出)
          • 非付费用户执行代码会报错
      • 3)重构后的代码
        • P110页示例3-5
    • 3.5.6 Gmail
      • 1)特点
        • 所有访问都是免费的
        • 提供了使用传输层安全(TLS)的SMTP
  • 3.6 相关模块
    • 3.6.1 电子邮件相关
      • P115页表3-6
    • 3.6.2 其他因特网客户端协议
      • P116页表3-7
posted @ 2021-05-08 22:00  洛兰123  阅读(244)  评论(0编辑  收藏  举报