twisted 网络通信模型
关键字: 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实例,在不需要工厂时可以直接使用这个类来产生仅使用一次的客户端连接。这时,协议对象之间没有共享状态,也不需要重新连接。
分享到:
相关推荐
反应器是 Twisted 网络通信模型的基石,它是事件循环的执行者,负责调度和分发事件,如连接建立、数据接收、连接关闭等。反应器通常是单例的,确保应用程序只有一个事件循环在运行。Twisted 提供了多种反应器实现,...
### Twisted网络编程知识点 #### 一、为什么选择Twisted? 1. **高效与灵活性**:Twisted 是一个异步事件驱动的网络引擎,适用于多种操作系统(如 Linux、Windows、Unix 和 Mac)。它能有效处理高并发场景下的网络...
除了基本的网络通信,Twisted还广泛应用于各种实际场景,如Web服务器(如Tornado)、XML-RPC、FTP服务器、DNS解析、实时数据流处理等。许多开源项目,如CouchDB、OpenSSH和Tor,都利用了Twisted的异步能力。 总的来...
2. **协议抽象**:Twisted提供了一系列的网络协议接口,包括TCP、UDP、HTTP、FTP等,使得开发者可以轻松地实现各种网络通信协议。 3. **服务组件**:Twisted提供了服务组件模型,允许开发者构建复杂的多层服务结构...
总结来说,异步编程和Twisted框架是提升Python网络应用性能的关键工具,理解其背后的模型和原理对于开发高效、可扩展的网络服务至关重要。通过深入学习,开发者能够掌握如何编写出能够在高并发环境下优雅运行的代码...
3. **中间件**:Scrapy的中间件机制允许自定义下载和解析逻辑,这些逻辑通常需要处理网络通信,而Twisted则提供了底层的支持。 4. **爬虫**:爬虫组件通过Twisted异步处理HTTP请求,获取网页内容,然后使用XPath或...
这种模型特别适合于I/O密集型的操作,比如网络通信。 Twisted的使用涉及到一系列的概念,如“回调”、“进程守护”以及“构造轮子内的轮子”,这些概念是Twisted框架的基石。例如,“回调”是在异步编程中处理异步...
第四部分到第六部分主要围绕Twisted支持的诗歌客户端的构建和改进,演示了如何用Twisted接口来实现网络通信。这些部分特别强调了客户端的设计模式,包括如何构建客户端的核心循环体、传输(Transports)、协议...
而Twisted则是一个异步网络编程库,它为Scrapy提供了底层的网络通信支持,使得Scrapy能够实现高效的并发爬取。在Python环境中,安装特定版本的Scrapy时,可能需要配合特定版本的Twisted,这就是"Twisted压缩包装...
通过深入学习和实践Twisted,你可以构建高效、灵活的网络应用,充分利用Python的便利性处理复杂的网络通信需求。`twisted-intro-master`这个项目应该包含了一系列示例代码,可以作为进一步学习的资源。
1. **网络协议支持**:Twisted提供了对多种网络协议的支持,包括TCP、UDP、HTTP、FTP、SMTP等,允许开发者快速实现网络通信功能。 2. **异步I/O**:Twisted的非阻塞I/O模型使得应用在处理大量并发连接时能够高效...
6. **SSL/TLS加密**:Twisted支持安全的网络通信,通过SSL/TLS协议加密数据传输。学习如何配置和使用这些功能,能确保你的网络应用安全可靠。 7. **异常处理和日志记录**:在编写网络程序时,正确处理异常和记录...
- **Twisted模型**:Twisted采用了事件驱动的非阻塞IO模型,即所谓的异步编程。它通过一个称为reactor的核心组件管理事件循环,使得可以在不阻塞主线程的情况下处理大量并发连接。 - **特点**:高效处理I/O密集型...
- Protocols:定义了网络通信的逻辑,比如HTTP、FTP等协议的实现。 - Endpoints:用于连接到服务器或监听客户端连接,抽象了不同类型的网络端点。 - Factories:创建Protocol实例的工厂,通常与服务端的监听端点...
2. **Protocols**: `Twisted` 提供了一系列预定义的协议类,如`TCPClient`、`HTTP`等,用户也可以自定义协议来处理特定的网络通信需求。 3. **Endpoints**: 端点接口提供了一种抽象层,使得启动和停止服务器或者...
《Twisted网络编程基础》第二版是一本深入探讨Python Twisted框架的权威书籍,它提供了大量实用的示例代码来帮助读者理解网络编程的核心概念。Twisted是一个强大的异步网络库,广泛应用于复杂的网络应用程序,如...
在 Python 2.5 版本中,Twisted 提供了一个强大的框架,用于处理并发和网络通信。Twisted 的设计目标是简化非阻塞I/O和网络协议的实现,使得开发者可以更专注于业务逻辑,而非底层的网络操作。 Twisted 包含了大量...