《Python核心编程(第3版)》——2.6 *Twisted框架介绍

2.6 *Twisted框架介绍

Twisted是一个完整的事件驱动的网络框架,利用它既能使用也能开发完整的异步网络应用程序和协议。在编写本书时,因为它还不是Python标准库的一部分,所以必须单独下载并安装它(可以使用本章末尾的链接)。它提供了大量的支持来建立完整的系统,包括网络协议、线程、安全性和身份验证、聊天/ IM、DBM及RDBMS数据库集成、Web/因特网、电子邮件、命令行参数、GUI集成工具包等。

使用Twisted来实现简单的例子,有点小题大做,但是你必须开始使用它,并且该应用程序就相当于网络应用程序的“hello world”。

与SocketServer类似,Twisted的大部分功能都存在于它的类中。特别是对于该示例,我们将使用Twisted因特网组件中的reactor和protocol子包中的类。

2.6.1 创建Twisted Reactor TCP服务器

你会发现示例2-10中的代码类似于SocketServer例子中的代码。然而,相比于处理程序类,我们创建了一个协议类,并以与安装回调相同的方式重写了一些方法。另外,这个例子是异步的。现在就让我们看一下服务器代码。

示例2-10 Twisted Reactor时间戳TCP服务器(tsTservTW.py)

这是一个时间戳TCP服务器,它使用了Twisted Internet类。

逐行解释
第1~6行

设置行代码包括常用模块导入,尤其是twisted.internet的protocol和reactor子包以及常数端口号的设置。

第8~14行

我们获得protocol类并为时间戳服务器调用TSServProtocol。然后重写了connectionMade()和dataReceived()方法,当一个客户端连接到服务器时就会执行connectionMade()方法,而当服务器接收到客户端通过网络发送的一些数据时就会调用dataReceived()方法。reactor会作为该方法的一个参数在数据中传输,这样就能在无须自己提取它的情况下访问它。

此外,传输实例对象解决了如何与客户端通信的问题。你可以看到我们如何在connectionMade()中使用它来获取主机信息,这些是关于与我们进行连接的客户端的信息,以及如何在dataReceived()中将数据返回给客户端。
第16~20行

在服务器代码的最后部分中,创建了一个协议工厂。它之所以被称为工厂,是因为每次得到一个接入连接时,都能“制造”协议的一个实例。然后在reactor中安装一个TCP监听器,以此检查服务请求。当它接收到一个请求时,就会创建一个TSServProtocol实例来处理那个客户端的事务。

2.6.2 创建Twisted Reactor TCP客户端

与SocketServer TCP客户端不同,示例2-11看起来与其他客户端都不同,这个是明显的Twisted。

示例2-11 Twisted Reactor时间戳TCP客户端(tsTclntTW.py)

同样是我们熟悉的时间戳TCP客户端,只是从一个Twisted的角度来写的。

逐行解释
第1~6行

再一次,除了导入Twisted组件之外,并没有什么新内容。它与其他的客户端非常类似。

第8~22行

类似于服务器,我们通过重写connectionMade()和dataReceived()方法来扩展Protocol,并且这两者都会以与服务器相同的原因来执行。另外,还添加了自己的方法sendData(),当需要发送数据时就会调用它。

因为这次我们是客户端,所以我们是开启与服务器对话的一端。一旦建立了连接,就进行第一步,即发送一条消息。服务器回复之后,我们就将接收到的消息显示在屏幕上,并向服务器发送另一个消息。

以上行为会在一个循环中继续,直到当提示输入时我们不输入任何内容来关闭连接。此时,并非调用传输对象的write()方法发送另一个消息到服务器,而是执行loseConnection()来关闭套接字。当发生这种情况时,将调用工厂的clientConnectionLost()方法以及停止reactor,结束脚本执行。此外,如果因为某些其他的原因而导致系统调用了clientConnectionFailed(),那么也会停止reactor。

在脚本的最后部分创建了一个客户端工厂,创建了一个到服务器的连接并运行reactor。注意,这里实例化了客户端工厂,而不是将其传递给reactor,正如我们在服务器上所做的那样。这是因为我们不是服务器,需要等待客户端与我们通信,并且它的工厂为每一次连接都创建一个新的协议对象。因为我们是一个客户端,所以创建单个连接到服务器的协议对象,而服务器的工厂则创建一个来与我们通信。

2.6.3 执行TCP服务器和客户端

与其他客户端类似,Twisted客户端也展示了输出。

$ tsTclntTW.py
> Where is hope
...sending Where is hope...
[Tue Apr 18 23:53:09 2006] Where is hope
> When words fail
...sending When words fail...
[Tue Apr 18 23:53:14 2006] When words fail
>
$

服务器恢复到单个连接。Twisted会保持连接,在每条消息发送后不会关闭传输。

$ tsTservTW.py
waiting for connection...
...connected from: 127.0.0.1

“connection from”的输出并不包含其他信息,因为我们只从服务器传输对象的getPeer()方法请求了主机/地址。

需要记住的是,大多数基于Twisted的应用程序都比本节给出的例子更加复杂。因为这是一个功能丰富的库,但是它确实有一定的复杂度,所以你需要做好准备。

时间: 2024-10-26 13:10:26

《Python核心编程(第3版)》——2.6 *Twisted框架介绍的相关文章

《Python核心编程(第二版)》——导读

前 言 欢迎走进Python核心编程 我们很高兴能帮你尽快并尽可能深入地学习Python.掌握语法是本书的一个目标,不管怎样,我们都坚信,哪怕是一个初学者,只要他能掌握Python的运作机理,他就不再仅仅是用Python"编写",而是能开发出更高效的Python应用程序.但是你知道,并不是掌握了一门语言的语法就能让你立刻登堂入室. 在本书中,你能发现许多可以立即上手的例子.为了巩固基础,你还会在每章的末尾找到有趣又富有挑战性的习题.这些初级和中级水平的习题可以检验你的学习效果,并且提升

《Python核心编程(第二版)》——1.3 特点

1.3 特点 尽管Python已经流行了超过15年,但是一些人仍旧认为相对于通用软件开发产业而言,它还是个新丁.我们应当谨慎地使用"相对"这个词,因为"网络时代"的程序开发,几年看上去就像几十年. 当人们询问:"什么是Python?"的时候,很难用任何一个具象来描述它.人们更倾向于一口气不加思索地说出他们对Python的所有感觉,Python是____(请填写),这些特点究竟又是什么呢?为了让你能知其所以然,我们下面会对这些特点进行逐一地阐释.

《Python核心编程(第二版)》——第1部分 Python核心 第1章 欢迎来到Python世界 1.1 什么是Python

第1部分 Python核心 第1章 欢迎来到Python世界 本章主题 什么是Python Python的起源 Python的特点 下载Python 安装Python 运行Python Python文档 比较Python(与其他语言的比较) 其他实现 开篇将介绍一些Python的背景知识,包括什么是Python.Python的起源和它的一些关键特性.一旦你来了兴致,我们就会向你介绍怎样获得Python,以及如何在你的系统上安装并运行它.本章最后的练习将会帮助你非常自如地使用Python,包括使用

《Python核心编程(第二版)》——1.5 运行Python

1.5 运行Python 有三种不同的办法来启动Python.最简单的方式就是交互式的启动解释器,每次输入一行Python代码来执行.另外一种启动Python的方法是运行Python脚本.这样会调用相关的脚本解释器.最后一种办法就是用集成开发环境中的图形用户界面运行Python.集成开发环境通常整合了其他的工具,例如集成的调试器.文本编辑器,而且支持各种像CVS这样的源代码版本控制工具. 1.5.1 命令行上的交互式解释器 在命令行上启动解释器,你马上就可以开始编写Python代码.在Unix,

《Python核心编程(第二版)》——1.4 下载和安装Python

1.4 下载和安装Python 得到所有Python相关软件最直接的方法就是去访问它的网站(http://python.org ).为了方便读者,你也可以访问本书的网站(http://corepython.com )并点击左侧的"Download Python"链接--我们在表格中罗列了当前针对大多数平台的Python版本,当然,这还是主要集中在"三巨头"身上:Unix,Win32和MacOS X. 正如我们在前面1.3.5小节中提到的,Python可应用的平台非常

《Python核心编程(第二版)》——1.7 比较Python(Python与其他语言的比较)

1.7 比较Python(Python与其他语言的比较) Python已经和很多语言比较过了.一个原因就是Python提供了很多其他语言拥有的特性,另外一个原因就是Python本身也是由诸多其他语言发展而来的,包括ABC.Modula-3.C.C++.Algol-68.SmallTalk.Unix shell和其他的脚本语言,等等.Python就是"浓缩的精华":Van Rossum研究过很多语言,从中吸收了许多觉得不错的特性,并将它们溶于一炉. 然而,往往因为Python是一门解释型

《Python核心编程(第二版)》——1.2 起源

1.2 起源 Guido van Rossum于1989年底始创了Python,那时,他还在荷兰的CWI(Centrum voor Wiskun- de en Informatica,国家数学和计算机科学研究院).1991年初,Python发布了第一个公开发行版.这一切究竟是如何开始的呢?像C.C++.Lisp.Java和Perl一样,Python来自于某个研究项目,项目中的那些程序员利用手边现有的工具辛苦地工作着,他们设想并开发出了更好的解决办法. 那时van Rossum是一位研究人员,对解

《Python核心编程(第二版)》——1.6 Python文档

1.6 Python文档 Python文档可以在很多地方找到,最便捷的方式就是从Python网站查看在线文档.如果你没上网,并且使用的是Win32系统,那么在C:Python2xDoc目录下会找到一个名为Python2x.chm的离线帮助文档.它使用IE接口,所以你实际上是使用网页浏览器来查看文档.其他的离线文档包括PDF和PostScript(PS)文件.最后,如果你下载了Python发行版,你会得到LaTeX格式的源文件. 在本书的网站中,我们创建了一个包括绝大多数Python版本的文档,只

《Python核心编程(第二版)》—— 1.8 其他实现

1.8 其他实现 标准版本的Python是用C来编译的,又被称为Cpython.除此之外,还有一些其他的Python实现.我们将在下面讲述些实现,除了本书中提到的这些实现以外,下面的网址还有更多的实现版本. http://python.org/dev/implementations.html Java 我们在上一节中曾经提到,还有一个可以用的 Python解释器是完全由Java写成的,名为Jython.尽管两种解释器之间存在一些细微的差别,但是它们非常接近,而且启动环境也完全相同.那Jython

《Python核心编程(第二版)》——1.9 练习

1.9 练习 1-1. 安装Python.请检查Python是否已经安装到你的系统上,如果没有,请下载并安装它. 1-2. 执行Python.有多少种运行Python的不同方法?你喜欢哪一种?为什么? 1-3. Python标准库. (a)请找到系统中Python执行程序的安装位置和标准库模块的安装位置. (b)看看标准库里的一些文件,比如string.py.这会帮助你适应阅读Python脚本. 1-4. 交互执行.启动你的Python交互解释器.你可以通过输入完整的路径名来启动它.当然,如果你