Twisted的網路通訊模型

2021-08-19 23:43:59 字數 4014 閱讀 4329

**:

twisted的網路通訊模型

一、twisted基本模型

twisted網路程式設計框架是一種基於事件的網路程式設計框架,使用者需要繼承特定的類,並過載其中的方法來處理網路通訊中可能出現的各種情況。twisted的網路通訊模型最基本的也要由三部分組成:反應器(reactor)、協議(protocol)、工廠(factory)。其中反應器用來執行事件迴圈,分發事件處理等等,每個應用程式中一般只能啟動乙個reactor。協議用來完成與乙個已經連線成功的主機的互動功能,主要有資料的接收和傳送功能。連線的斷開事件也可以在這裡處理。工廠負責與乙個協議的啟動和關閉功能,而且還負責在連線成功時生成乙個協議物件,(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.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.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 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例項,在不需要工廠時可以直接使用這個類來產生僅使用一次的客戶端連線。這時,協議物件之間沒有共享狀態,也不需要重新連線。

5 OSI網路通訊模型

在網路剛出現的早期,不同製造商的計算機產品之前是不能通訊的,使得計算機資源無法通訊共享資源。為了促進計算機網路的發展,國際標準化組織iso在現有網路的基礎上,提出了不基於具體機型 作業系統或公司的網路體系結構,稱為開放系統互聯osi open system interconnection 模型。圖1...

網路通訊模型 P2P模型

一 p2p模型的概念 伺服器是網路中最容易受到攻擊的節點,一旦海量地向伺服器發出服務請求,就能導致伺服器癱瘓,以致所有客戶都不能得到服務響應,為了解決這種問題,就出現了p2p模型。p2p可以理解為對等網際網路,又翻譯為點對點或者端對端。在p2p模型中網路的參與者共享它們所擁有的一部分資源,這些資源通...

加密解密及安全網路通訊模型

一 前言 加密技術是一門古老而深奧的學科,長期以來,都應用在很小的範圍,如軍事 外交 情報等部門。西元前405年,斯巴達的將領就使用了原始的錯亂密碼 公元1世紀,羅馬皇帝凱撒就使用了有序的單錶代替密碼。中國古代出現的 符 也是一種資料加密的方法。20世紀初,電子通訊技術的發展,尤其是兩次世界大戰中,...