一、twisted基本模型
twisted 網路程式設計框架是一種基於事件的網路程式設計框架,使用者需要繼承特定的類,並過載其中的方法來處理網路通訊
中可能出現的各種情況。
twisted的網路通訊模型 最基本的也要由三部分組成:反應器(reactor)、協議(protocol)、工廠(factory)。
1、其中反應器reactor用來執行事件迴圈,分發事件處理等 等,每個應用程式中一般只能啟動乙個reactor。
2、協議用來完成與乙個已經連線成功的主機的互動功能,主要有資料的接收和傳送功能。連線的斷開事件也可以在這
裡處理。注意是在連線建立之後protacal才開始負責下面的工作的。
3、工廠負責與乙個協議的啟動和關閉功能,而且還負責在連線成功時生成乙個協議物件,(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的網路通訊模型 最基本的也要由三部分組成 反應器 reactor 協議 protocol 工廠 factory 1 其中反應器reactor用...
Twisted的網路通訊模型
twisted的網路通訊模型 一 twisted基本模型 twisted網路程式設計框架是一種基於事件的網路程式設計框架,使用者需要繼承特定的類,並過載其中的方法來處理網路通訊中可能出現的各種情況。twisted的網路通訊模型最基本的也要由三部分組成 反應器 reactor 協議 protocol ...
繼續談談Twisted
那我就來繼續隨便談談twisted 首先討論一下,為什麼需要twisted,需要非同步 為了更高效的利用cpu和資源,提高使用者的相應速度 任務需要較長時間才能完成分成兩種情況,1 計算量較大,需要cpu算好久才能算出來,自然算出來才能給結果,稱為cpu等待.2 需要等待其他的資料,比如需要從伺服器...