Protocol
和服務器一樣,也是通過該類來實現。先看一個簡短的例程:
from twisted.internet.protocol import Protocolfrom sys import stdoutclass Echo(Protocol): def dataReceived(self, data): stdout.write(data)
在本程序中,只是簡單的將獲得的數據輸出到標準輸出中來顯示,還有很多其他的事件沒有作出任何響應,下面
有一個回應其他事件的例子:
from twisted.internet.protocol import Protocolclass WelcomeMessage(Protocol): def connectionMade(self): self.transport.write("Hello server, I am the client!/r/n") self.transport.loseConnection()
本協議連接到服務器,發送了一個問候消息,然后關閉了連接。
connectionMade事件通常被用在建立連接的事件發生時觸發。關閉連接的時候會觸發connectionLost事件函數
(Simple, single-use clients)簡單的單用戶客戶端
在許多情況下,protocol僅僅是需要連接服務器一次,并且代碼僅僅是要獲得一個protocol連接的實例。在
這樣的情況下,twisted.internet.protocol.ClientCreator提供了一個恰當的API
from twisted.internet import reactorfrom twisted.internet.protocol import Protocol, ClientCreatorclass Greeter(Protocol): def sendMessage(self, msg): self.transport.write("MESSAGE %s/n" % msg)def gotProtocol(p): p.sendMessage("Hello") reactor.callLater(1, p.sendMessage, "This is sent in a second") reactor.callLater(2, p.transport.loseConnection)c = ClientCreator(reactor, Greeter)c.connectTCP("localhost", 1234).addCallback(gotProtocol)
ClientFactory(客戶工廠)
ClientFactory負責創建Protocol,并且返回相關事件的連接狀態。這樣就允許它去做像連接發生錯誤然后
重新連接的事情。這里有一個ClientFactory的簡單例子使用Echo協議并且打印當前的連接狀態
from twisted.internet.protocol import Protocol, ClientFactoryfrom sys import stdoutclass Echo(Protocol): def dataReceived(self, data): stdout.write(data)class EchoClientFactory(ClientFactory): def startedConnecting(self, connector): print 'Started to connect.' def buildProtocol(self, addr): print 'Connected.' return Echo() def clientConnectionLost(self, connector, reason): print 'Lost connection. Reason:', reason def clientConnectionFailed(self, connector, reason): print 'Connection failed. Reason:', reason
要想將EchoClientFactory連接到服務器,可以使用下面代碼:
from twisted.internet import reactorreactor.connectTCP(host, port, EchoClientFactory())reactor.run()
注意:clientConnectionFailed是在Connection不能被建立的時候調用,clientConnectionLost是在連接關閉的時候被調用,兩個是有區別的。
新聞熱點
疑難解答