主要類: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.ClientFactory的protocol屬性來指定工廠的protocol.Protocol,protocol.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.hostdef 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() # 開始監聽