一、Twisted基本模型

Twisted 网络编程框架是一种基于事件的网络编程框架,用户需要继承特定的类,并重载其中的方法来处理网络通信 中可能出现的各种情况。

Twisted的网络通信模型 最基本的也要由三部分组成:反应器(reactor)、协议(protocol)、工厂(factory)。

1、其中反应器reactor用来执行事件循环,分发事件处理等等,每个应用程序中一般只能启动一个reactor。
2、协议protocol用来完成与一个已经连接成功的主机的交互功能,主要有数据的接收和发送功能。连接的断开事件也可以在这里处理。注意是在连接建立之后protocol才开始负责下面的工作的。

3、工厂factory负责与一个协议protocol的启动和关闭功能,而且还负责在连接成功时生成一个协议protocol对象,(by gashero)用于与远程主机的交互功能。

一个典型的Twisted应用程序会建立至少一个协议,可以从twisted.internet.protocol.BaseProtocol类或其子类继承。协议还需要实现数据的接收处理,即收到数据之后需要做出何种响应。

比较简单的Twisted应用程序可以继承一个空的工厂,来自 twisted.internet.protocol.Factory或其子类。工厂至少应该指定protocol属性,指向协议类。

最后就是要启动事件循环,根据连接方向的不同(客户端或者服务端),可以选择用reactor的connectXXX()或listenXXX()方法,然后执行reactor.run()启动事件循环。

二、协议模型

所有协议类的基类是 twisted.internet.protocol.BaseProtocol,但是一般使用其子类。不同的协议子类提供了不同 的数据接收方法,如 LineReceiver子类就允许同时使用行和原始数据两种方法接收数据,使用非常方便。

BaseProtocol的接口如下:
class BaseProtocol:
  connected=0 #是否已经连接了
  transport=None #用于数据发送的传输对象
  def makeConnection(self,transport): #建立连接的方法,不是事件方法,一般不要重载
  def connectionMade(self): #连接成功事件,可重载
可以看到BaseProtocol可以理解为一个虚基类,实现的功能十分简陋。

实际的应用程序一般也不是直接继承BaseProtocol来实现协议,而是继承Protocol类。Protocol类提供了基本完善的协议功能,接口定义如下:

class Protocol(BaseProtocol):
  def dataReceived(self,data): #接收到数据事件,可重载
  def connectionLost(self,reason=connectionDone): #连接断开事件,可重载,依靠reason区分断开类型

从Protocol类继承就可以完成协议的基本处理了,包括连接的建立和断开事件,还有数据接收事件。

三、工厂模型

相对于协议,工厂可以发挥的空间就很小了。所有工厂的基类是twisted.internet.protocol.Factory。这个类定义了三个方法,接口如下:
class Factory:
  protocol=None #指向一个协议类
  def startFactory(self): #开启工厂
  def stopFactory(self): #关闭工厂
  def buildProtocol(self,addr):
   #构造协议对象,并给协议对象添加一个factory属性指向工厂,可以重载

从这里可以看到,工厂类中最重要的部分就是协议protocol属性,将这个属性设置为一个协议类(注意不是协议对象),就可以将这个工厂设置为对应协议的工厂了。

前两个方法控制工厂的开启和关闭,用于资源的初始化和释放,可以重载。

buildProtocol()方法可以控制协议对象的生成,(by gashero)如果需要多传递一个属性,可以重载,但是重载时应该注意在方法内继承原方法内容。

工厂还分为客户端工厂和服务器工厂。


服务器工厂继承自Factory,而没有任何修改,定义如下:
class ServerFactory(Factory):

客户端工厂则有较多内容,接口定义如下:
class ClientFactory(Factory):
  def startedConnecting(self,connector): #连接建立成功时
  def clientConnectionFailed(self,connector,reason): #客户端连接失败
  def clientConnectionLost(self,connector,reason): #连接断开
这三个方法都传递了一个connector对象,这个对象有如下方法可用:
connector.stopConnection() #关闭会话
connector.connect() #一般在连接失败时用于重新连接

四、连接器

连接器指客户端用来连接的包装。
twisted.internet.protocol.ClientCreator是一个连接器,用来连接远程主机,接口定义如下:
class ClientCreator:
  def __init__(self,reactor,protocolClass,*args,**kwargs):
  def connectTCP(self,host,port,timeout=30,bindAddress=None):
  def connectUNIX(self,address,timeout=30,checkPID=0):
  def connectSSL(self,host,port,contextFactory,timeout=30,bindAddress=None):
三个连接方法都是返回Deferred对象作为Protocol实例,在不需要工厂时可以直接使用这个类来产生仅使用一次的客 户端连接。这时,协议对象之间没有共享状态,也不需要重新连接。

五、反应器(reactor)

在Twisted中,有一种特殊的对象用于实现事件循环。这个对象叫做reactor。
可以把反应器(reactor)想象为Twisted程序的中枢神经。
reactor根据平台的不同,提供了不同的实现,在使用的时候,可以根据平台的不同,选择不同的reactor。
除了分发事件循环之外,反应器还做很多重要的工作:定时任务、线程、建立网络连接、监听连接。
为了让反应器可以正常工作,需要启动事件循环。
from twisted.internet import reactor
print 'Running the reactor ...'
reactor.run()
print 'Reactor stopped.'
这样就建立了一个事件循环。

reactor.callLater方法用于设置定时事件:
reactor.callLater函数包含两个必须参数,等待的秒数,和需要调用的函数
意思是多少秒钟之后调用某个函数
在实际应用中,reactor.callLater是常用于超时处理和定时事件。可以设置函数按照指定的时间间隔来执行关闭非活

动连接或者保存内存数据到硬盘。

reactor.stop()停止循环,退出循环

http://wwty.iteye.com/blog/400971

Twisted基本模型相关推荐

  1. python twisted是什么_Twisted基础介绍(一)

    什么是Twisted 1.Twisted是一个基于Reactor模式的异步IO网络框架 首先说下什么是Reactor模式.Reactor模式就是利用循环体来等待事件发生,然后处理发生的事件的模式,如上 ...

  2. python asyncio回调函数_最近用 Python 的 asyncio,有好多不懂。。

    15 2017-03-14 19:35:58 +08:00   16 说下我对这 python 这几种 web 模型的理解吧: 首先是 http server + wsgi server(contai ...

  3. Twisted模型简介

    Twisted简介 Twisted 网络编程框架是一种基于事件的网络编程框架,用户需要继承特定的类,并重载其中的方法来处理网络通信中可能出现的各种情况.一个典型的Twisted应用程序会建立至少一个协 ...

  4. Twisted入门教程(3)

    第三部分:开始认识Twisted 可以从这里从头开始阅读这个系列. 用twisted的方式实现前面的内容 最终我们将使用twisted的方式来重新实现我们前面的异步模式客户端.不过,首先我们先稍微写点 ...

  5. (转) Twisted :第二十一部分 惰性不是迟缓: Twisted和Haskell

    2019独角兽企业重金招聘Python工程师标准>>> 简介 在上一个部分我们对比了Twisted与 Erlang,并将注意力集中在它们共有的一些思想上.结果表明使用Erlang也是 ...

  6. Muduo 网络编程示例之四:Twisted Finger

    陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 这是<Muduo 网络编程示例>系列的第四篇文章. Muduo 全系列文章列表: http:/ ...

  7. 使用Python的twisted和socket模块实现端口的负载分发

    很简单的需求,自己写个类似iptables那样的dnat端口转发,简单实现像lvs那样的nat模式的端口的负载分发,当然性能堪忧哈~ 这个例子是 监听 本地ip的9999端口,然后映射到另一个端口上, ...

  8. python twisted和flask_浅谈Python Web 框架:Django, Twisted, Tornado, Flask, Cyclone 和 Pyramid...

    Django 是一个高级的 Python Web 框架,支持快速开发,简洁.实用的设计.如果你正在建一个和电子商务网站相似的应用,那你应该选择用 Django 框架.它能使你快速完成工作,也不必担心太 ...

  9. Mina、Netty、Twisted一起学(五):整合protobuf

    protobuf是谷歌的Protocol Buffers的简称,用于结构化数据和字节码之间互相转换(序列化.反序列化),一般应用于网络传输,可支持多种编程语言. protobuf怎样使用这里不再介绍, ...

最新文章

  1. 十八般武艺玩转GaussDB(DWS)性能调优(三):好味道表定义
  2. 计算机专业考研是哪个学科,我是大二计算机专业女生 想考研 但对未来的考研专业感到很迷茫 不知道都有什么方向 并且每个专业方向的......
  3. django-debug-toolbar 工具
  4. 三十岁还没做到管理层的人,后来都怎么样了?
  5. mapxtreme 2005 v6.6 破解
  6. 《计算机操作系统》第四版(汤小丹考研版) 全书知识梳理
  7. 2019年区块链专利增速可能放缓?
  8. 树莓派编译ch934x usb转多串口驱动
  9. python写入文件没反应_Python write 函数写文件失败
  10. C# winfrom窗体及控件 根据系统的分辨率自动调整位置
  11. C/C++找工作这点事
  12. Frida:一款可以绕过越狱检测的工具
  13. html盒子连续点击连续移动,html盒子整体向下移动
  14. java如何保证数据安全_java高并发下怎么保障数据安全?有哪些办法?
  15. 计算机 基础知识练习题
  16. QT程序打包--教你做一个可安装的应用程序
  17. WindowsAPI编程 简单的计算器
  18. Henry前端笔记之 宏观世界
  19. 数据库的增删查改(全部重点知识一篇整合,包括数据库查询的进阶内容)
  20. 2022淘宝618超级喵运会玩法来了 超级喵运会有哪些攻略方法

热门文章

  1. 水星UD6S网卡Linux驱动,水星UD6S驱动
  2. jdk8新特性之for循环
  3. 记一次安装centOS7.X遇到的i8042 i8042 no controller found和安装源感叹号
  4. [从零开始学习FPGA编程-29]:进阶篇 - 基本时序电路-时序电路的两大基本特征(状态记忆与时钟触发)
  5. 使用vue+zrender绘制体温单 三测单(1)
  6. 3ml乐谱制作工具_用于生产的ML基础结构工具(第1部分)
  7. 服务器双机系统,华为服务器双机热备
  8. 文科生读计算机博士,文科类哪些专业博士前景好?看完这篇就懂了!
  9. 使用MongoDB 可视化工具Robomongo(Robo 3T)查看数据
  10. Python 爬虫进阶篇——Selenium教程(一)