1. 网络通信概述

  • 网络通信起源
    • 起源于战争,服务于军事
    • 计算机之间相互传递信息
  • 网络协议-七层协议
    • 协议: 保证相互通信的一套规章制度,操作,或者流程
    • 分层:每一层按照协议做自己的事情,然后把结果向邻居层次介绍
    • 七层:学术模型
      • 应用层
      • 表示层
      • 会话层
      • 网络层
      • 数据链路层
      • 物理层
    • 实际使用是四层协议
  • 协议族:一组功能相似的协议
  • TCP/IP协议族
    • TCP(TransmissionControlProtocal)
      • 基于链接的,每次传输数据都要建立链接
      • 建立链接需要消耗资源,带宽等,需要消耗时间
      • 传输数据安全,可靠,数据传输有序
    • UDP(UserDatagramProtocal)
      • 无连接
      • 安全性差,数据接受无顺序
      • 传输消耗带宽小,没有专门链接需要消耗资源

2. socket编程

  • socket:套接字,在网络里边,通过ip地址和端口进行通信的一种机制
  • IP地址:用于在互联网上唯一表示一台机器的一个由数字构成的串,由四个字段构成
    • IPv4, IPv6

      比如: 192.168.1.1, 26.34.123.87

  • 端口: 进行应用程序身份鉴定的一个数字
    • 65535以下都可以
    • 一般1000以下不推荐开发者自行使用
  • TCP/UDP编程
    • UDP编程
      • 无连接
      • 客户端(Client) 和 服务器端(Server)
      • Server端流程
        1. 建立socket,socket是负责具体通信的一个实例
        2. 绑定,为创建的socket指派固定的端口和ip地址
        3. 接受对方发送内容
        4. 给对方发送反馈,此步骤为非必须步骤
      • Client端流程
        1. 建立通信的socket
        2. 发送内容到指定服务器
        3. 接受服务器给定的反馈内容
      • 案例01是服务器,02是客户端
      • 需要注意的是,发送的消息是经过编码处理后的,即只能发送bytes
        • 要想得到bytes格式的信息,需要用到str.encode
        • 如果有bytes格式信息,想得到字符串,需要用到bytes.decode
      • 服务器程序要求永久运行,需要用死循环实现
        • 参见案例03
    • TCP编程
      • 面向链接的传输,即每次传输之前需要先建立一个链接
      • 客户端和服务器端两个程序需要编写
      • Server端的编写流程
        1. 建立socket负责具体通信,这个socket其实只负责接受对方的请求,真正通信的是链接后从新建立的socket
        2. 绑定端口和地址
        3. 监听接入的访问socket
        4. 接受访问的socket,可以理解接受访问即建立了一个通讯的链接通路
        5. 接受对方的发送内容,利用接收到的socket接收内容
        6. 如果有必要,给对方发送反馈信息
        7. 关闭链接通路
        8. 参看案例04
      • Client端流程
        1. 建立通信socket
        2. 链接对方,请求跟对方建立通路
        3. 发送内容到对方服务器
        4. 接受对方的反馈
        5. 关闭链接通路
        6. 参看案例05

          3. FTP编程

  • FTP(FileTransferProtocal)文件传输协议
  • 用途:定制一些特殊的上传下载文件的服务
  • 用户分类,登录FTP服务器必须有一个账户
    1. Real账户:注册账户
    2. Guest账户:可能是临时的对某一类人的行为进行允许
    3. Anonymous账户:匿名账户,允许任何人
  • FTP工作流程
    1. 客户端链接远程主机上的FTP服务器
    2. 客户端输入用户名和密码(或者“anonymous”和电子邮件地址)
    3. 客户端和服务器进行各种文件传输和信息查询操作
    4. 客户端从远程FTP服务器退出,结束传输
  • FTP文件表示
    • 分三段表示FTP服务器上的文件
    • HOST:主机地址,类似于 ftp.mozilla.org, 以ftp开头
    • DIR:目录, 表示文件所在本地的路径,例如 pub/android/focus/1.1-RC1/
    • File: 文件名称, 例如 Klar-1.1-RC1.apk
    • 如果想完整精确表示ftp上某一个文件,需要上述三部分组合在一起
  • 案例06

    4. 邮件客户端

    电子邮件的历史

  • 起源
    • 1969 Leonard K. 教授发给同事的 “LO”
    • 1971 美国国防部资助的阿帕网(Arpanet)的通讯机制
    • 通讯地址里用@(读作艾特),是因为这个符号比较生僻,不会出现在正常的名称中
    • 1987年中国第一封电子邮件, “Across the Great Wall we can reach every corner in the world”
  • 管理程序
    • Euroda使邮件飞入寻常百姓家
    • Netscape和Outlook,Foxmail后来居上
    • Hotmail使用浏览器收发邮件
  • 参考资料

邮件工作流程

  • laoshi@qq.com, 老师,北京海淀
  • xuesheng@sina.com, 学生,上海江岸区
  • MUA(MailUserAgent)邮件用户代理
  • MTA(MailTransferAgent)用户传输代理
  • MDA(MailDeliveryAgent)邮件投递代理
  • 流程
    1. MUA->MTA, 邮件已经在服务器上了
    2. qq MTA->………->sina MTA, 邮件在新浪的服务器上
    3. sina MTA-> sina MDA, 此时邮件已经在你的邮箱里了
    4. sina MDA -> MUA(Foxmail/Outlook), 邮件下载到本地电脑
  • 编写程序过程
    1. 发送: MUA->MTA with SMTP:SimpleMailTransferProtocal,包含MTA->MTA
    2. 接受: MDA->MUA with POP3 and IMAP:PostOfficeProtocal v3 and InternetMessageAccessProtocal v4
  • 准备工作
    • 注册邮箱(以qq邮箱为例)
    • 第三方邮箱需要特殊设置,以qq邮箱为例
      • 进入设置中心
      • 取得授权码
  • Python for mail
    • SMTP:负责发送邮件
      1. email:构造邮件
        • 纯文本邮件(案例07)
          • 直接把邮件内容写入就好
        • HTML格式邮件(案例08)
          • 准备HTML代码作为邮件内容
          • 把邮件是subtype修改为html
        • 带附件的邮件(案例09)
          • 看做是一个文本邮件和一个附件的合体
          • 一封邮件如果涉及到多个部分,需要使用MIMEMultipart格式构建
          • 添加一个MIMEText正文
          • 添加一个MIMEBase或者MEMEText作为附件
        • 添加邮件头,抄送等信息(案例10)
          • 王大鹏1366798119@qq.com, 如果想让对方看到这种格式的邮件发送,需要用Header构建邮件头
          • 同时,所有字符串形式的内容都需要编码
          • mail[“From”], 表示的是发送者信息,包括姓名和邮件地址
          • mail[‘To’], 表示接受者信息,包括姓名和地址邮件
          • mail[‘Subject’], 表示摘要或者主题信息
        • 同时支持HTML/Text格式(案例11)
          • 构建一个MIMEMultipart格式邮件
          • MIMEMultipart邮件subtype为alternative格式
          • HTML和Text个添加一个邮件
      2. smtplib:发送邮件
    • POP3(接受邮件)
      • 本质上是MDA到MUA的一个过程
      • 从 MDA下载下来的是一个完整的邮件结构体,需要解析才能得到每个具体可读的内容
      • 步骤:
        1. 用poplib下载邮件结构体原始内容
          1. 准备相应的内容(邮件地址,密码,POP3实例)
          2. 身份认证
          3. 一般会先得到邮箱内邮件的整体列表
          4. 根据相应序号,得到某一封信的数据流
          5. 利用解析函数进行解析出相应的邮件结构体
        2. 用email解析邮件的具体内容
      • 案例12