我有一個簡單的客戶端/服務器安裝時不獲取調用。這裏的客戶端代碼:扭曲的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」(等等)有額外的行爲,但我想不通爲什麼它工作在第二代碼片段,但不是第一個。
任何想法?
至於最後那句話, 「隨着終點[...]實例工廠[...]管理。」從設計的角度來看,爲什麼工廠的行爲會根據是否使用端點而改變?出於某種原因,這感覺非常不直觀。如果它不再是工廠的責任,那麼當使用端點時,該功能來自哪裏? – Novark
我記得,這個想法是,工廠界面不太好,利用新的端點界面來幫助用戶遠離它是更好的選擇。替換功能可能取決於您希望通過工廠方法實現的目標。 https://twistedmatrix.com/documents/16.4.1/api/twisted.application.internet.ClientService.html涵蓋了一些用例(大致上是由ReconnectingClientFactory處理的)。 –
感謝您的信息。您是否知道概述此替換功能和/或整體架構的任何文檔? API文檔是一回事,但總結一下這些東西應該如何使用和融合在一起會很好。 – Novark