Twisted的网络通信模型

转自:https://blog.csdn.net/gashero/article/details/1519049


Twisted的网络通信模型

一、Twisted基本模型

Twisted网络编程框架是一种基于事件的网络编程框架,用户需要继承特定的类,并重载其中的方法来处理网络通信中可能出现的各种情况。Twisted的网络通信模型最基本的也要由三部分组成:反应器(reactor)、协议(protocol)、工厂(factory)。其中反应器用来执行事件循环,分发事件处理等等,每个应用程序中一般只能启动一个reactor。协议用来完成与一个已经连接成功的主机的交互功能,主要有数据的接收和发送功能。连接的断开事件也可以在这里处理。工厂负责与一个协议的启动和关闭功能,而且还负责在连接成功时生成一个协议对象,(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.protocols包中寻找(by gashero)更多的答案。如果需要自己实现一种协议,比较推荐的是twisted.protocols.basic.LineReceiver类。LineReceiver默认按照文本行模型进行通信,接收数据也是以行为单位。但是也可以设置使用原始数据模式进行通信。比较典型的应用就是HTTPChannel协议类。HTTP协议在请求报文头部和响应报文头部的传送时使用的是行模式,而在实体主体的传输时又是使用的原始数据模型。所以使用LineReceiver是非常合适的。LineReceiver的接口定义如下:

class LineReceiver(protocol.Protocol,_PauseableMixin):

    line_mode=1

    __buffer=''

    delimiter="/r/n"

    MAX_LENGTH=16384 #一行的最大长度,字节

    def clearLineBuffer(self):    #清空缓冲区

    def dataReceived(self,data):  #继承父类的方法,用于分发事件,不要重载

    def setLineMode(self,extra=""): #设置工作状态为行模式

    def setRawMode(self):           #设置工作状态为原始数据模式

    def rawDataReceived(self,data): #原始数据接收事件,可重载

    def lineReceived(self,line):    #行数据接收事件,可重载

    def sendLine(self,line):        #以行模式发送数据

    def lineLengthExceeded(self,line): #当接收到的一行长度超过了最大值时的错误响应,并断开连接

可以看到LineReceiver类提供的功能已经相当的完善了,可以手动设置工作状态并提供了完善的事件响应方法。如果要发送原始数据,可以使用如下方法:

self.transport.write(data)

至于self.transport对象,这个是所有的协议对象都有的成员,可以看出是从BaseProtocol就已经存在的。self.transport对象一般使用twisted.internet.protocol.FileWrapper类实现,其主要接口是与文件对象相同的。FileWrapper另外提供的方法包括生产者/消费者的支持,还有就是连接控制。

self.transport.loseConnection() #关闭连接

self.transport.getPeer()        #获取对方信息

self.transport.getHost()        #获取本机信息

其他还有很多方法,读者可以自己尝试阅读源码并使用。

三、工厂模型

相对于协议,工厂可以发挥的空间就很小了。所有工厂的基类是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实例,在不需要工厂时可以直接使用这个类来产生仅使用一次的客户端连接。这时,协议对象之间没有共享状态,也不需要重新连接。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值