2017-01-01 14 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() 

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

От конечной точки Docs здесь: http://twistedmatrix.com/documents/current/core/howto/endpoints.html

 Смежные вопросы

  • Нет связанных вопросов^_^