Mit Verdreht, wie kann ‚connectionMade‘ Feuer eine bestimmte latente?
-
05-09-2019 - |
Frage
Dies ist Teil eines größeren Programms; Ich werde nur die relevanten Teile erklären. Grundsätzlich mein Code will eine neue Verbindung zu einer Remote-Host erstellen. Dies sollte zurückgeben eine latente, die feuert, sobald die Verbindung hergestellt ist, so kann ich etwas darauf senden.
Ich schaffe die Verbindung mit twisted.internet.interfaces.IReactorSSL.connectSSL
. Das ruft buildProtocol
auf meiner ClientFactory
Instanz ein neues Verbindung (twisted.internet.protocol.Protocol
) Objekt zu erhalten, und gibt einen twisted.internet.interfaces.IConnector
. Wenn die Verbindung gestartet wird, ruft Verdrehte startedConnecting
auf der Fabrik, den IConnector
geben. Wenn die Verbindung tatsächlich erfolgt, wird das Protokolls der connectionMade
Rückruf aufgerufen, ohne Argumente.
Nun, wenn ich brauchte nur eine Verbindung pro Host / Port, wäre der Rest einfach. Vor connectSSL
Aufruf, würde ich erstellen Latente und legte sie in einem Wörterbuch verkeilt (Host, Port). Dann wird in der connectionMade Protokoll, konnte ich self.transport.getPeer()
verwenden, um die Host / Port abzurufen, verwenden sie die latenten nachzuschlagen, und seine Rückrufe ausgelöst. Aber dies offensichtlich bricht, wenn ich mehr als eine Verbindung erstellt werden soll.
Das Problem ist, dass ich keine andere Möglichkeit sieht, kann ein zu assoziieren Latente ich vor dem Aufruf connectSSL
mit dem connectionMade
erstellt später.
Lösung
Blick auf diese etwas mehr, ich glaube, ich habe mit einer Lösung zu kommen, obwohl hoffentlich es ein besserer Weg ist; dies scheint irgendwie seltsam.
Verdrehte hat eine Klasse, ClientCreator
, die für die Herstellung von einfachen Einweg-Verbindungen verwendet wird. Es theoretisch tut, was ich will; verbindet und eine Deferred
zurückgibt, die ausgelöst wird, wenn die Verbindung hergestellt ist. Ich glaube nicht, dass ich diese nutzen könnte, obwohl, da ich die Fähigkeit verlieren würde Argumente das Protokoll Konstruktor übergeben und haben daher keine Möglichkeit, Zustand zwischen Verbindungen zu teilen.
Allerdings habe ich gerade realisiert, dass der ClientFactory
Konstruktor *args
das Protokoll Konstruktor übergeben akzeptiert. Oder zumindest sieht es aus wie es; gibt es praktisch keine Dokumentation für diese. In diesem Fall kann ich ihm einen Verweis auf meine Fabrik geben (oder was auch immer, wenn die Fabrik nicht mehr erforderlich ist). Und ich bekomme die Deferred
zurück, die ausgelöst wird, wenn die Verbindung hergestellt ist.