章节知识路线
- 2.1 简介
- 2.2 客户端/服务器架构
- 2.3 套接字:通信端点
- 2.4 Python中的网络编程
- 2.5 *SocketServer模块
章节主张:网络编程章的核心不是会写 TCP/UDP 示例,而是建立“连接、地址、会话、阻塞、边界”这些基础通信概念。
中文释读:大量后续系统能力都建立在客户端/服务器模型上。真正要学的是通信双方如何约定,错误发生在什么层,阻塞与并发如何影响服务行为。
把 2.1 简介 放回本章上下文,它更像是 结构化数据交换与系统边界 的一个具体落点。
怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。
提醒:最常见的问题是只记住 2.1 简介 的 API 或步骤,却没搞清它的上下游依赖与边界条件。
第 2 章 网络编程 43 2.1 简介 本节将简要介绍使用套接字进行网络编程的知识。
怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。
提醒:最常见的问题是只记住 2.2 客户端/服务器架构 的 API 或步骤,却没搞清它的上下游依赖与边界条件。
第 2 章 网络编程 43 2.1 简介 本节将简要介绍使用套接字进行网络编程的知识。 然而,在深入研究之前,将介绍一些 有关网络编程的背景信息,以及套接字如何应用于 Python 之中,然后展示如何使用 Python 的一些模块来创建网络应用程序。 2.2 客户端/服务器架构 什么是客户端/服务器架构?
46 第 1 部分 通用应用主题 这个过程与网络世界一样,一旦一个通信端点已经建立,监听服务器就可以进入无限循 环中,等待客户端的连接并响应它们的请求。
怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。
提醒:最常见的问题是只记住 2.3 套接字:通信端点 的 API 或步骤,却没搞清它的上下游依赖与边界条件。
46 第 1 部分 通用应用主题 这个过程与网络世界一样,一旦一个通信端点已经建立,监听服务器就可以进入无限循 环中,等待客户端的连接并响应它们的请求。 当然,为了使公司电话接待员一直处于忙碌状 态,我们绝不能忘记将电话号码放在公司信笺、广告或一些新闻稿上;否则,将没有人会打 电话过来! 相似地,必须让潜在的客户知道存在这样的服务器来处理他们的需求;否则,服务器将 永远不会得到任何请求。 想象着创建一个全新的网站,这可能是最了不起的、劲爆的、令人 惊异的、有用的并且最酷的网站,但如果该网站的 Web 地址或 URL 从来没有以任何方式广 播或进行广告宣传,那么永远也不会有人知道它,并且也将永远不会看到任何访问者。
48 第 1 部分 通用应用主题 面向连接的通信提供序列化的、可靠的和不重复的数据交付,而没有记录边界。
怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。
提醒:最常见的问题是只记住 2.4 Python中的网络编程 的 API 或步骤,却没搞清它的上下游依赖与边界条件。
48 第 1 部分 通用应用主题 面向连接的通信提供序列化的、可靠的和不重复的数据交付,而没有记录边界。 这基本 上意味着每条消息可以拆分成多个片段,并且每一条消息片段都确保能够到达目的地,然后 将它们按顺序组合在一起,最后将完整消息传递给正在等待的应用程序。 实现这种连接类型的主要协议是传输控制协议(更为人熟知的是它的缩写 TCP)。
62 第 1 部分 通用应用主题 (续表) 属 性 名 称 描 述 gethostbyname_ex() gethostbyname()的扩展版本,它返回主机名、别名主机集合和 IP 地址列表 gethostbyaddr() 将一个 IP 地址映射到 DNS 信息;返回与 gethostbyname_ex()相同的 3 元组 getprotobyname() 将一个协议名(如‘tcp’)映射到一个数字 getservbyname()/getservbyport() 将一个服务名映射到一个端口号,或者反过来;对于任何一个函数来说,协议名都是可 选的 ntohl()/ntohs() 将来自网络的整数转换为主机字节顺序 htonl()/htons() 将来自主机的整数转换为网络字节顺序 inet_aton()/inet_ntoa() 将 IP 地址八进制字符串转换成 32 位的包格式,或者反过来(仅用于 IPv4 地址) inet_pton()/inet_ntop() 将 IP 地址字符串转换成打包的二进制格式,或者反过来(同时适用于 IPv4 和 IPv6 地址) getdefaulttimeout()/setdefaulttimeout() 以秒(浮点数)为单位返回默认套接字超时时间;以秒(浮点数)为单位设置默认套接 字超时时间 ① Python 2.2 中新增。
怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。
提醒:最常见的问题是只记住 2.5 *SocketServer模块 的 API 或步骤,却没搞清它的上下游依赖与边界条件。
62 第 1 部分 通用应用主题 (续表) 属 性 名 称 描 述 gethostbyname_ex() gethostbyname()的扩展版本,它返回主机名、别名主机集合和 IP 地址列表 gethostbyaddr() 将一个 IP 地址映射到 DNS 信息;返回与 gethostbyname_ex()相同的 3 元组 getprotobyname() 将一个协议名(如‘tcp’)映射到一个数字 getservbyname()/getservbyport() 将一个服务名映射到一个端口号,或者反过来;对于任何一个函数来说,协议名都是可 选的 ntohl()/ntohs() 将来自网络的整数转换为主机字节顺序 htonl()/htons() 将来自主机的整数转换为网络字节顺序 inet_aton()/inet_ntoa() 将 IP 地址八进制字符串转换成 32 位的包格式,或者反过来(仅用于 IPv4 地址) inet_pton()/inet_ntop() 将 IP 地址字符串转换成打包的二进制格式,或者反过来(同时适用于 IPv4 和 IPv6 地址) getdefaulttimeout()/setdefaulttimeout() 以秒(浮点数)为单位返回默认套接字超时时间;以秒(浮点数)为单位设置默认套接 字超时时间 ① Python 2.2 中新增。 ② Python 2.5 中新增。 ③ Python 2.6 中新增。
66 第 1 部分 通用应用主题 $ tsTclntSS.py > 'Tis but a scratch. [Tue Apr 18 20:55:49 2006] 'Tis but a scratch. > Just a flesh wound. [Tue Apr 18 20:55:56 2006] Just a flesh wound. > $ 这是服务器的输出。
怎么用:把这节内容转成自己的一个最小脚本、接口实验或系统边界测试,验证它在真实任务中的输入输出。
提醒:最常见的问题是只记住 2.6 *Twisted框架介绍 的 API 或步骤,却没搞清它的上下游依赖与边界条件。
66 第 1 部分 通用应用主题 $ tsTclntSS.py > 'Tis but a scratch. [Tue Apr 18 20:55:49 2006] 'Tis but a scratch. > Just a flesh wound. [Tue Apr 18 20:55:56 2006] Just a flesh wound. > $ 这是服务器的输出。 $ tsTservSS.py waiting for connection... ...connected from: ('127.0.0.1', 53476) ...connected from: ('127.0.0.1', 53477) 此时的输出与最初的 TCP 客户端和服务器的输出类似。 然而,你应该会发现,我们连接 了服务器两次。
为什么很多网络示例看起来能跑,但一进真实环境就不稳定?