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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top