Twisted.Network.Programming.Essentials2.1

偶然的机会需要学习pythontwisted编程,首先需要对twisted的框架进行相当的了解。OReilly.Twisted.Network.Programming.Essentials是一本相当不错的书。从今天开始,我就每天进行每个章节的重点翻译以及分析,希望能够给大家提供帮助,同时也督促自己每天按时完成任务。

 

2.1. 开始twisted事件循环

Twisted是一个事件驱动框架。也就是说,与一般程序的函数通过一定的程序逻辑来处理数据不同,他们被叫做外部响应或者事件。比如说,一个GUI程序可能含有按键点击时间响应的代码。程序的设计者不能确定该事件在何时准确的发生,但是他的函数能够在事件发生的时候对其进行响应。这种函数就是我们所知的事件处理函数。

每个事件驱动框架包含了一个特殊的函数叫做事件循环。一旦开始之后,事件循环就无限期地运行下去。当事件循环运行的时候,他会等待事件。当一个时间发生时,事件循环就能触发一个合适的事件处理函数。

使用事件循环的思想来编程和传统的思想来做同样的事需要有不同的理念。一旦你开始了事件循环,你就不能再次指导你的程序来做什么了。他只能对事件进行响应。因此,你需要通过事件和事件处理函数来设计你的程序。你需要你的程序来响应哪些事件?当一个事件发生时,你想要他怎样反应?

twisted中,有一个特殊的对象实现了事件循环,这个对象叫做reactor。你可以想象reactortwisted程序的中枢神经系统。除了对事件循环负责外,reactor还处理许多其他重要的任务:调度,线程处理,建立网络连接以及监听其它电脑的连接。为了实现reactor来做这些事,你一定要开始事件循环,转换你程序的控制权。

 

2.1.1. 怎样做?

开始reactor很简单。从twisted.internet模块导入reactor对象,然后调用reactor.run( )来实现reactor的事件循环。

Example 2-1. runreactor.py

   

 

 

这是一个相当无聊的例子。尽管reactor在运行,他其实没有做任何的事情。例子2.2提供了更加有趣的代码,他介绍了reactorcallLater方法。reactor.callLater用来建立事件调度。该方法在你将来想要调度函数的时候相当有用。在例子2.2中,函数在一个预定的时间后被调用。

Example 2-2. calllater.py

        运行这个程序,你会得到如下的输出:

 

2.1.2.如何工作?

例子2.1只是简单地导入了reactor以及调用了reactor.run()函数来开始。直到你按下Ctrl-C之前,reactor会一直执行(尽管没有做任何事情)。

第二个例子调用了reactor.callLater函数来调度一些函数的执行。reactor.callLater有两个参数,分别是需要等待的秒数以及执行函数的名称。在配置好了调度函数之后,控制权就交给了reactor的事件循环函数reactor.run()

前四个调度函数调用了printTime(),它只是简单地打印当前的时间。第五个函数调用了stopReactor(),该函数内部调用了reactor.stop(),使得reactor退出当前事件的循环。也就是说这次你不用按下Ctrl-C,程序就会自动停止了。

注意事件的发生顺序,反应器按照给定的时间来调用指定的函数。一旦反应器开始运行,反应器就会控制事件循环,并在指定时间调用函数。反应器在被告知停止之前 会一直运行,直到reactor.stop()调用。一旦反应器停止了,程序将继续处理最后一行,显示反应器停止的消息。

 

2.1.3. 建立一个TCP连接

所有的网络应用程序都必须做一个简单的步骤,开启一个连接。接着可以发送邮件、传递文件、看电影等等。但是在所有这些之前,必须在电脑之间建立一个连接。本节讲解了如何使用reactor开启TCP连接。

 

2.1.4. 如何工作?

reactor.connectTCP()方法打开一个TCP连接,传递一个ClientFactory对象作为第三个参数。ClientFactory对象等待连接被建立,然后创建一个Protocol对象来管理连接中的数据流。下面的例子2-3展示了如何在电脑和 Internet之间建立一个连接(www.google.com)

 

2.1.5. 如何工作?

这里有两个主要的类用于作为客户端工作,ClientFactoryProtocol。这些类被设计成处理连接中所有可能运到的事件:成功建立连接、连接失败、连接断开、数据传送等等。

ClientFactoryProtocol有严格的不同。ClientFactory的工作是管理连接事件,并且创建Protocol对象处理每一个成功的连接。一旦连接建立,Protocol对象就接管下面的工作了,包括收发数据和决定是否关闭连接。

Tip:名字"Factory"ClientFactory是来自于Protocol的请求,响应每一个成功的连接。

例子2-3定义了自定义的Protocol叫做QuickDisconnectProtocol,继承自protocol.Protocol。它重载了一个方法connectMade。这个方法连接成功时运行,在reactor刚刚成功建立了连接,然后ClientFactory创建了QuickDisconnectProtocol的实例时。有如他的名字,QuickDisconnectProtocol对象在打印信息之后就马上关闭 了。

Tip:Protocol对象有一个属性叫做transport,包含了当前活动连接对象。

BasicClientFactory是继承自protocol.ClientFactory的类。它首先设置了类变量protocolQuickDisconnectProtocol。这个类的实例被创建用于管理成功的连接。

BasicClientFactory 重载了ClientFactory的两个方法,clientConnectionLostclientConnectionFailed。这两个方法是 事件处理器。clientConnectionFailed在反应器无法建立连接时被调用。clientConnectionLost在建立的连接被关闭或断开时调用。调用reactor.connectTCP函数告知反应器建立TCP连接,

reactor.connectTCP('www.google.com',80,BasicClientFactory())

这一行告知反应器建立一个TCP连接到服务器www.google.com80端口,通过BasicClientFactory来管理连接。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值