twisted學習筆記二--twisted的那三板斧

来源:互联网 发布:工作计划软件app 编辑:程序博客网 时间:2024/06/07 02:01
http://blog.csdn.net/moxien/article/details/5344588
分类: twisted 692人阅读 评论(0) 收藏 举报
classimport教育c

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)

0 0