本文是《Python基础教程(第2版 修订版)》第 14 章 网络编程 的笔记,简要介绍了Python中的socket模块、SocketServer、同时处理多个连接时的三种方式以及Twisted的简要介绍等内容。
1. Networking Mudules
诸多针对常见网络协议的库以及处理字节流的擅长使得成为一个很强大的网络编程工具。在编写程序时,可以重点关注程序的核心逻辑,而非网络实现细节。
1.1 The socket Module
是网络编程中的一个基本组件,也是两个端点的程序之间的通信渠道。在中的大多数网络编程都隐藏了模块的基本细节,不需要直接和通信。
可分服务器和客户端。服务器端必须准备随时处理客户端的连接,同时还要处理多个连接。客户端只是简单地连接,完成事务,断开连接。
一个是模块中类的一个实例。其实例化需要个参数:第个参数为地址族,默认为;第个参数为流,默认为或数据报;第个参数为使用的协议,默认为。
有两个方法用于传输数据。方法使用字符串参数来发送数据。方法用一个所需的最大字节数做参数来接收数据。
1.2 The urllib and urllib2 Modules
和在功能上差不多。如果只使用简单的下载,就够了。如果需要验证或,或者要为自己的协议编写扩展程序,更好。
使用模块中的可以以只读模式打开远程文件。返回的类文件对象支持、、、和迭代等方法。
可以下载文件并在本地文件中存储一个文件的副本。返回一个元组。是本地文件的名字,由自动创建,也可以在调用时指定。包含一些远程文件的信息。
使用函数可以清理临时文件,该函数会负责清理工作。使用下载文件时,如果没有指定文件名和路径,那么文件就会被放在临时位置。
还提供了一些函数操作本身
返回一个字符串,其中所有的特殊字符都已被对友好的字符所代替。字符串包含了不应该采用这种方式编码的字符,默认为
功能与类似,但用代替空格。
与相反。
与相反。
把映射或者包含两个元素的元组的序列转换成格式编码的字符串。
1.3 Other Modules
标准库中一些与网络相关的模块
:的增强版本
:异步处理程序
:基本的支持
:对象操作,主要用于服务器
:客户端支持
:消息支持,包括
:客户端模块
:客户端。一种采用菜单式驱动的信息查询工具,采用客户机/服务器模式
:客户端模块
:客户端模块
:读取几种邮箱的格式
:通过文件访问配置
:访问邮箱
:客户端模块
:客户端模块
:支持解析服务器的文件
:一个简单的服务器
:服务器模块
:客户端模块
:客户端模块
:支持解析
:的客户端支持
2. SocketServer
模块是标准库中很多服务器框架的基础,包括、、、和。
包含个基本的类:针对流式的、针对数据报的和针对性不强的和。通常很少用到后个。
编写一个使用框架的服务器,可能会将大部分代码放在一个请求处理程序中。每当服务器收到一个请求,就会实例化一个请求处理程序,并且它的各种处理方法会在处理请求时被调用。具体调用哪个取决于特定的服务器和请求的处理程序类。还可以子类化,使得服务器调用自定义的处理程序集。
类把所有操作都放到处理器的方法中。该方法被服务器调用时,就会访问中的客户端。
使用流,例如,那么可以使用类。使用读取和写入,就能使用这些类文件对象和客户机进行通信。
框架中的其他类实现了对服务器的基本支持,包括对运行脚本、的支持。
3. Multiple Connections
如果需要同时处理多个连接,那么有三种主要方法:
分叉
线程
异步
通过对服务器使用混合类,派生进程和线程很容易处理多个连接的问题。
3.1 Forking and Threading with SocketServer
分叉是一个术语,不支持分叉。
当分叉一个进程时,基本上是复制了它,都有自己的内存副本,并且分叉后的两个进程都从当前的执行点继续运行。一个进程成为父进程,另一个分叉出来的成为子进程。
在一个使用分叉的服务器中,父进程监听连接,分叉出来的子进程处理客户端。当客户端的请求结束时,子进程退出。分叉的进程是并行运行的,因此客户端之间不必互相等待。
分叉占据资源:每个分叉出来的进程都需要自己的内存,并且客户端连接很多的时候,分叉不能很好的分叉。
线程可以解决占用资源的问题。线程是轻量级的进程,所有线程都存在于相同的进程中,共享内存。但同时也产生了同步问题,即同一时间修改同一内容会造成冲突。
避免线程和分叉的另一个方法是转换到,一个为了能够在不同的上下文之间快速、方便切换而设计的版本,支持一个叫做微线程的类线程的并行形式。
3.2 Asynchronous I/O with select and poll
当服务器和客户端通信时,分叉或线程的处理方式是一个程序等待数据,另一个并行的程序继续处理它自己的客户端。而异步,则只处理在给定时间内真正要进行通信的客户端,不需要一直监听。也是框架和框架采用的方法。
该功能的基础是模块中的函数和函数。函数的伸缩性更好,但只能在系统中使用。
函数需要个序列作为参数,第个参数为可选的以秒为单位的超时时间。这个序列是文件描述符整数或者是带有返回这样整数的方法的对象,用于输入、输出和异常情况。序列能包括文件对象(中不行)或者套接字。超时时间如果未给定,则会阻塞,即等待状态。如果给定,则最多阻塞给定的超时时间。如果为,则给出一个连续的,即不阻塞。的返回值是个序列,每个代表相应参数的一个活动子集。
在调用时,会得到一个对象。然后可以使用对象的方法注册一个文件描述符或者带有方法的对象,注册后可以使用方法移除注册的对象。注册对象后,可以调用带有可选的超时时间参数的方法,得到一个格式列表,是文件描述符,是一个,一个整数,对应相应的事件。
模块中的事件常量:
:读取来自文件描述符的数据
:读取来自文件描述符的紧急数据
:文件描述符已经准备好数据,写入时不会发生阻塞
:与文件描述符有关的错误情况
:挂起,连接丢失
:无效请求,连接没有打开
4. Twisted
是一个事件驱动的网络框架,支持服务器、客户机、、、、、、、、、、和等。
事件处理程序在一个协议中定义,在一个新的连接到达时,需要一个创建这种协议对象的工厂。创建一个通用的协议类的实例,可以使用自带的工厂。
很多情况下需要得到的是一行数据,而不是任意数据。模块中包含一个有用的预定义协议,是。它实现了并且只要收到了一整行就调用事件处理程序。
如果要在接受数据时做些事情,可以使用由定义的事件处理程序。也可以使用,但它依赖于的实现。
领取专属 10元无门槛券
私享最新 技术干货