::-- limodou [2005-12-02 04:49:37]
Contents
1. 三、创建 client 的套路
第二节说到的两个类,是TCP协议客户端的创建套路(方式)。这个套路拆解如下:
1. 定义“工厂”和“协议”两个类:
(1)“协议”类是 CallbackAndDisconnectProtocol,“工厂”类是 ConnectionTestFactory
- 类的名字不重要,但必须正确说明所继承的父类:
class CallbackAndDisconnectProtocol(protocol.Protocol)
class ConnectionTestFactory(protocol.ClientFactory)
(2)“协议”类是“工厂”类实例化的:protocol = CallbackAndDisconnectProtocol;
(3)只在“工厂”类中有 init 函数,并在其中实例化一个deferred 对象:
- self.deferred = defer.Deferred( )
(4)在“工厂”类中,重设父类函数 clientConnectionFailed,通过deferred 引发事件,报告连接失败:
- self.deferred.errback(reason)
(5)在“协议”类中,重设父类函数 onnectionMade,由对象factory引用“工厂”类中的deferred,经其引发事件,报告连接正常:
- self.factory.deferred.callback("Connected!")
并由对象transport引发事件,报告连接断开:
- self.transport.loseConnection( );
上述“对象”,都是从各自父类继承来的。
2. 在函数testConnect(host, port)中,
(1)将“工厂”类实例化:testFactory = ConnectionTestFactory( )
(2)由全局循环“主持人”reactor建立以testFactory为“主演”的TCP连接:
- reactor.connectTCP(host, port, testFactory)
(3)返回deferred对象:return testFactory.deferred
至此,一个以事件驱动为基础、异步执行任务的框架程序搭成了。
上述三节的内容,据 Twisted 官方说,是“学习曲线最陡”的部分(They represent the steepest part of the Twisted learning curve.)。
我的感受,造成“最陡”的原因,是由于套路新颖独特,初学乍练不易适应。
- 框架对象众多,一时记不牢;
- 对象之间的关系比较复杂,一时理不清;
- “事件驱动”这种模式,反映在程序文本中,有时见不到明显的函数调用,让人觉得程序的去向不明;
另外,学习方法很重要。如果以学“语言”的习惯来学框架,遇上问题寻根究底,过分追求“水落石出”;或者,依赖教科书、畸重“理论”,忽视 examples 语句、结构和API文档的分析研究,都不利于翻越这段陡坡。
据我的体验,集中精力地啃嚼主干骨架,不纠緾于细枝末节,这段最陡的上坡路,顶多爬个十天八天的,就能越过去。