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?
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
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). –
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