У меня есть простая настройка клиент/сервер. Вот код клиента:Закрученные методы фабрики 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()
По какой-то причине, этот клиент будет подключаться к серверу и протокол работает правильно (я могу видеть «Привет!», Напечатанной вместе с данными, посылаемых сервером при успешном соединении) , но он не будет вызывать какие-либо из заводских методов протокола. startConnecting не вызывается, и если я остановлю сервер, я не вижу, как вызываются вызовы 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