twisted的那三板斧
一個twisted網絡程序最基本的三個構件reactor、Factory、Protocol, 我稱之為twisted三板斧。想當年程爺爺就靠那三板斧幫李世民打下半壁江山,威力自然不可小覦。傳說中程咬金還有那絕殺的半個板斧,不過,不到關鍵時 刻不會使出,絕殺的東西用得多了,就不是絕殺。希望twisted也有那絕殺的半個板斧。
先看一下代碼。
| #!/usr/bin/env python #coding=utf-8 from twisted.internet import protocol,reactor class muProtocol(protocol.Protocol): def connectionMade(self): print 'connectionMade' self.factory.clients[self]={} self.factory.clients[self]['isblankly']=True def dataReceived(self,data): self.factory.clients[self]['isblankly']=False self.transport.write(self.factory.getSomething(data)) print 'receive: %s' % data if data=='q': self.transport.loseConnection() class muFactory(protocol.ServerFactory): protocol=muProtocol def __init__(self): reactor.callLater(5,self.timeout) self.clients={} def timeout(self): print 'timeout check.' for c in self.clients: if self.clients[c]['isblankly']: c.transport.loseConnection() else: self.clients[c]['isblankly']=True reactor.callLater(5,self.timeout) def getSomething(self,data): return '/n/rServer say: %s/n/r' % data reactor.listenTCP(20190,muFactory()) reactor.run() |
上面的代碼作為第一個例子可能有點長,twisted文檔簡單的服務程序樣例代碼只有11行,但我這個也很簡單,也就 是那三板斧。下面開始解說那三板斧怎麼耍。
首先是導入相應的庫from twisted.internet import protocol,reactor,這不用細說,接下來是耍出那三板斧。
class muProtocol(protocol.Protocol) ,定義自己的Protocol
class muFactory(protocol.ServerFactory),定義自己的Factory
reactor.listenTCP(20190,muFactory()), 架設reactory
reactor.run(),運行reactor
一開始對這三者的三角關係也許弄不明,其實也很明了簡單,絕不像男女之間三角關係那麼混亂。作個比方,Protocol為原料供應 商,Factory為加工工廠將原料加工成自己的產品,reactor為營運公司。
營運公司 reactor, 決定工廠Factory的運作方式、什麼時候開始動作以 及其它一些動作。
工廠Factory,接收原料供應商的原料並加工處理成所需 產品,並管理供應商,工廠可以選擇供應商、不爽時可以終止供應商的關係。
原料供應商Protocol,它只是將原料送到工廠,並告知工廠有貨到,交完貨後它就不管了,工廠喜歡怎麼做是你的事。或者原料供應出現異常也會通知工廠。
yy這麼久後, 下面要看下三者關係的確立。
首先定義Protocol,以便響應Protocol不同事件。
class muProtocol(protocol.Protocol)
上面代碼中connectionMade 在鏈接發生時響應, 在接收到數據時響應dataReceived, 另外還有一個鏈接丟失時響應的connectionLost 沒有在上面代碼中用上。
雖然 Protocol定義好後,但它並未真正運行,因為沒人向它訂貨。
客戶來了!建立Factory,有工廠當然就需要原料,這樣一來Protocol就有生意可做啦。
class muFactory(protocol.ServerFactory): #定義工廠
protocol=muProtocol #這一句指明了工廠與哪家供應商Protocol建立合作關係,合同簽了可不能反悔哦。
工廠建好了,原料供應 也正常了,開工賺錢羅!等等,誰讓你開工的,老大還沒開口呢,看來你們需要被教育下。
雖然工廠建好,原料供應 正常,還要老大開下口,看下稅務、財務之類的準備好沒有。
老大開口了。
reactor.listenTCP(20190,muFactory()) #嗯,海外市場環境不好,出口不好做,決定做內銷,讓muFactory來做吧。
reactor.run() #一聲令下開工,銀子白花花的來啊,爽
啊啊,這篇東東 好像快完結了,上面代碼用來作什麼還沒講呢。
整個程序是將客戶端送過來的數據在前面加上 '/n/rServer say: %s/n/r'後,再送回客戶端。另外加入超時機制, 鏈接如果空閒5秒鍾(沒有接收數據),就斷開那個鏈接。
def __init__(self):
reactor.callLater(5,self.timeout) #建立工廠時就制定巡查制度
def timeout(self):
print 'timeout check.'
#領導巡查時間
reactor.callLater(5,self.timeout)