2017-01-01 2 views
0

Ich habe eine einfache Client/Server-Setup. Hier ist der Client-Code:Twisted Python Factory-Methoden werden nicht aufgerufen, wenn mit Reaktor-Wrapper

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() 

Aus irgendeinem Grunde dieser Client mit dem Server verbinden und das Protokoll korrekt funktioniert (kann ich sehen, „Hallo!“ Gedruckt, zusammen mit Daten von dem Server nach einer erfolgreichen Verbindung gesendet) , aber es ruft keine der Protokollfabrik-Methoden auf. startedConnecting wird nicht aufgerufen, und wenn ich den Server stoppe, wird clientConnectionLost nicht aufgerufen. Wenn ich versuche, den Client auszuführen, bevor der Server gestartet wurde, würde ich auch erwarten, dass clientConnectionFailed aufgerufen wird.

Hier ist der seltsame Teil ... Wenn ich die letzten drei Zeilen im Code ändern oben auf die folgenden:

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

Dann funktioniert alles wie erwartet, und alle Methoden in allen Fällen skizzierte gecallt über.

Mein Verständnis der Endpunkte ist, dass sie "connectTCP" (unter anderem) mit zusätzlichen Verhalten, aber ich kann nicht herausfinden, warum es im zweiten Code-Snippet funktioniert, aber nicht der erste.

Irgendwelche Ideen?

Antwort

1

Die Client-Endpunkt-Schnittstelle ruft die zusätzlichen Verbindungsstatus-Benachrichtigungsmethoden ClientFactory nicht auf.

Also, während Endpunkte in gewissem Sinne "wickeln" connectTCP et al, ist es nicht wahr, dass sie genau das gleiche Verhalten wie die Verwendung dieser untergeordneten Methoden haben.

Bei den Endpunkten besteht die Aufgabe der Factory darin, Protokollinstanzen bereitzustellen. Die Fabrik ist nicht mehr für andere Aspekte des Verbindungsmanagements verantwortlich.

+0

In Bezug auf diesen letzten Satz: "Mit Endpunkten [...] Instanzen Die Fabrik [...] Management.." Warum verändert sich das Verhalten der Fabrik je nach Design, abhängig davon, ob Endpunkte verwendet werden oder nicht? Aus irgendeinem Grund fühlt sich das sehr unintelligent an. Wenn es nicht länger die Verantwortung der Fabrik ist, woher kommt diese Funktionalität dann, wenn Endpunkte verwendet werden? – Novark

+0

Ich erinnere mich, dass die Factory-Schnittstelle nicht sehr gut war und es besser wäre, die neue Endpunkt-Schnittstelle zu nutzen, um Benutzer davon abzuhalten. Die Austauschfunktionalität hängt möglicherweise genau davon ab, was Sie mit den Fabrikmethoden erreichen wollten. https://twistedmatrix.com/documents/16.4.1/api/twisted.application.internet.ClientService.html deckt einige der Anwendungsfälle ab (in etwa die, die zuvor von ReconnectingClientFactory behandelt wurden). –

+0

Danke für die Info. Ist Ihnen eine Dokumentation bekannt, die diese Ersatzfunktionalität und/oder die gesamte Architektur beschreibt? API-Dokumente sind eine Sache, aber es wäre toll, eine Zusammenfassung darüber zu erhalten, wie dieses Zeug verwendet werden soll und zusammenpassen soll. – Novark

0

Zusätzlicher Hinweis meine Diskussion über ergänzen:

Wenn Sie ClientFactory vor verwendet haben, beachten Sie, dass die Methode connect nimmt eine Fabrik, kein ClientFactory. Selbst wenn Sie eine ClientFactory an endpoint.connect übergeben, werden ihre Methoden clientConnectionFailed und clientConnectionLost nicht aufgerufen. Insbesondere Clients, die ReconnectingClientFactory erweitern, werden nicht erneut verbunden. Im nächsten Abschnitt wird beschrieben, wie Sie das erneute Verbinden von Clients auf Endpunkten einrichten.

Von den Endpunkt docs finden Sie hier: http://twistedmatrix.com/documents/current/core/howto/endpoints.html

Verwandte Themen