Twisted之客戶端編程

主要類:reactor protocol

這兩個類都存在與 twisted.internet  命名空間中

reactor對象是Twisted編程當中的第一步,它就是一個反應器,專門負責與服務端的連接以及監聽與服務器交互,一旦與服務端連接上以後,即可調用reactor.run()開始監聽了,服務器有新的任務或請求傳送到客戶端的時候,reactor即可監聽到,一旦監聽到服務端的任務或請求,reactor會將該任務或請求轉交給客戶端工廠進行處理,一直重複着監聽—轉交—監聽—轉交-.......  的工作,直到調用reactor.stop()或者整個程序退出時該監聽任務纔會退出。

我們來看下reactor是如何連接服務端的,reactor對象提供了個connectTCP(host,port,Factory)方法,該方法帶有三個參數;第一個參數是要連接的服務端的ip地址,第二個參數是服務端在監聽的端口;既然reactor可以將服務端的任務或請求轉交給客戶端工廠,那麼它必須要有個可以轉交的工廠,一個Factory,,第三個參數就是reactor要這個客戶端工廠對象,該工廠類必須要繼承自 protocol.ClientFactory 類,protocol.ClientFactory類提供了一系列可拓展方法,如buildProtocol、clientConnectionMade、clientConnectionFailed、clientConnectionLost等,你可以通過重寫的方式自己實現。

好的,轉交工作做完之後,是不是reactor的任務就完成了呢,是的,reactor的任務到此就完成了。但是,任務或請求轉交之後,那麼誰來處理這些任務或請求呢,這就要交給工廠

protocol.ClientFactory 下面的protocol.Protocol來處理了,可以通過protocol.ClientFactoryprotocol屬性來指定工廠的protocol.Protocolprotocol.Protocol也提供了一系列可拓展的方法,如connectionMade、connectionLost、dataReceived,這裏重點講下dataReceived方法,它有個data參數,該參數就是從服務端傳送至客戶端的數據,你可以通過重寫該方法的方式處理接收到的數據,同樣也可以通過透明代理 transport.getPeer()來獲取數據發送端(這裏指服務端)的ip和port。


下面是一個簡單的Demo:


#coding=utf-8
from twisted.internet import reactor,protocol     #  導入 reactor , protocol

class QuickDisconnectProtocol(protocol.Protocol):
    def connectionMade(self):      
        self.hostInfo = self.transport.getPerr()    #  通過 透明代理獲取數據發送端主機信息 Ip
 print "Connected to %s." % self.hostInfo.host self.transport.loseConnection()class BasicClientFactory(protocol.ClientFactory):
protocol=QuickDisconnectProtocol # 通過protocol.ClientFactory 的 protocol 屬性指定 protocol.Protocol
    def dataRecieved(self,data):      # 重寫 dataRecieved 方法處理接收到的數據     
        print data % "from host : %s." % self.hostInfo.host

def clientConnectionLost(self,connector,reason): print "lost connection: %s" % reason.getErrorMessage() reactor.stop() # 連接斷開後終止監聽 def clientConnectionFailed(self,connector,reason): print "Connection failed:%s" % reason.getErrorMessage() reactor.stop() # 連接失敗後終止監聽reactor.connectTCP("192.168.10.41",80,BasicClientFactory())
# 開始連接服務端reactor.run() # 開始連接服務端 reactor.run() # 開始監聽






發佈了19 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章