2017-01-01 58 views
0

我有一個簡單的客戶端/服務器安裝時不獲取調用。這裏的客戶端代碼:扭曲的Python工廠方法使用反應器的包裝

from twisted.internet import reactor 
from twisted.internet import protocol 
from twisted.internet.endpoints import TCP4ClientEndpoint 

class MyProtocol(protocol.Protocol): 

    def connectionMade(self): 
     print "Hello!" 

    def dataReceived(self, data): 
     print data 

class MyProtocolFactory(protocol.ClientFactory): 

    def startedConnecting(self, connector): 
     print "Starting to connect!" 

    def buildProtocol(self, addr): 
     return MyProtocol() 

    def clientConnectionLost(self, connector, reason): 
     print "Lost connection, reason = %s" % reason 

    def clientConnectionFailed(self, connector, reason): 
     print "Connection failed, reason = %s" % reason 
     reactor.stop() 

endpoint = TCP4ClientEndpoint(reactor, "127.0.0.1", 54321, timeout=5) 
endpoint.connect(MyProtocolFactory()) 
reactor.run() 

出於某種原因,該客戶端將連接到服務器和協議工作正常(我可以看到「你好!」字樣,以在成功連接到服務器發送數據一起) ,但它不會調用任何協議工廠方法。 startedConnecting不會被調用,如果我停止服務器,我沒有看到clientConnectionLost被調用。如果我嘗試在服務器啓動之前運行客戶端,我也希望看到clientConnectionFailed被調用。

這裏的怪一部分......如果我改變最後3行,上面的代碼如下:

reactor.connectTCP("127.0.0.1", 54321, MyProtocolFactory()) 
reactor.run() 

然後一切正常,所有的方法被調用在所有的情況概述以上。

我的終點的理解是,他們包裝「connectTCP」(等等)有額外的行爲,但我想不通爲什麼它工作在第二代碼片段,但不是第一個。

任何想法?

回答

1

客戶終端接口不調用ClientFactory額外的連接狀態通知方法。因此,雖然端點在某種意義上「包裝」了connectTCP等,但它們與使用這些較低層次的方法具有完全相同的行爲並不是真實的。

隨着終點,工廠的工作是提供協議實例。工廠不再負責連接管理的其他方面。

+0

至於最後那句話, 「隨着終點[...]實例工廠[...]管理。」從設計的角度來看,爲什麼工廠的行爲會根據是否使用端點而改變?出於某種原因,這感覺非常不直觀。如果它不再是工廠的責任,那麼當使用端點時,該功能來自哪裏? – Novark

+0

我記得,這個想法是,工廠界面不太好,利用新的端點界面來幫助用戶遠離它是更好的選擇。替換功能可能取決於您希望通過工廠方法實現的目標。 https://twistedmatrix.com/documents/16.4.1/api/twisted.application.internet.ClientService.html涵蓋了一些用例(大致上是由ReconnectingClientFactory處理的)。 –

+0

感謝您的信息。您是否知道概述此替換功能和/或整體架構的任何文檔? API文檔是一回事,但總結一下這些東西應該如何使用和融合在一起會很好。 – Novark

0

附加說明,補充我上面的討論:

如果你曾經使用過ClientFactory,請記住,在連接方法需要一個工廠,而不是一個ClientFactory。即使你傳遞一個ClientFactory到endpoint.connect,其clientConnectionFailed和clientConnectionLost方法將不會被調用。特別是,擴展ReconnectingClientFactory的客戶端不會重新連接。下一節介紹如何在端點上設置重新連接客戶端。

從端點文檔在這裏找到:http://twistedmatrix.com/documents/current/core/howto/endpoints.html