Twisted基本模型

2021-07-03 05:44:26 字數 3759 閱讀 3823

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的connect***()或listen***()方法,然後執行

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 serve***ctory(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中,有一種特殊的物件用於實現事件迴圈。這個物件叫做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()停止迴圈,退出迴圈

Twisted基本模型

一 twisted基本模型 twisted 網路程式設計框架是一種基於事件的網路程式設計框架,使用者需要繼承特定的類,並過載其中的方法來處理網路通訊 中可能出現的各種情況。twisted的網路通訊模型 最基本的也要由三部分組成 反應器 reactor 協議 protocol 工廠 factory 1...

Twisted的網路通訊模型

twisted的網路通訊模型 一 twisted基本模型 twisted網路程式設計框架是一種基於事件的網路程式設計框架,使用者需要繼承特定的類,並過載其中的方法來處理網路通訊中可能出現的各種情況。twisted的網路通訊模型最基本的也要由三部分組成 反應器 reactor 協議 protocol ...

繼續談談Twisted

那我就來繼續隨便談談twisted 首先討論一下,為什麼需要twisted,需要非同步 為了更高效的利用cpu和資源,提高使用者的相應速度 任務需要較長時間才能完成分成兩種情況,1 計算量較大,需要cpu算好久才能算出來,自然算出來才能給結果,稱為cpu等待.2 需要等待其他的資料,比如需要從伺服器...