Con Contorto, come può il fuoco 'connectionMade' una specifica anticipate?
-
05-09-2019 - |
Domanda
Questo fa parte di un programma più ampio; Mi spiego solo le parti interessate. In sostanza, il mio codice vuole creare una nuova connessione a un host remoto. Questo dovrebbe restituire un differito, che spara una volta stabilita la connessione, in modo da posso inviare qualcosa su di esso.
Sto creando il collegamento con twisted.internet.interfaces.IReactorSSL.connectSSL
. Ciò richiede buildProtocol
sul mio esempio ClientFactory
per ottenere un nuovo oggetto connessione (twisted.internet.protocol.Protocol
), e restituisce una twisted.internet.interfaces.IConnector
. Quando viene avviato il collegamento, Contorto chiama startedConnecting
sulla fabbrica, dandogli la IConnector
. Quando la connessione è in realtà costituito, richiamata connectionMade
del protocollo si chiama, senza argomenti.
Ora, se ho solo bisogno di una connessione per host / port, il resto sarebbe stato facile. Prima di chiamare connectSSL
, vorrei creare una differita e metterlo in un dizionario calettato su (host, port). Poi, nel connectionMade del protocollo, potrei usare self.transport.getPeer()
per recuperare l'host / port, usarlo per cercare il differita, e fuoco le sue funzioni di callback. Ma questo, ovviamente, si rompe verso il basso se voglio creare più di una connessione.
Il problema è che non riesco a vedere nessun altro modo per associare un differita ho creato prima di chiamare connectSSL
con il connectionMade
più tardi.
Soluzione
Guardando a questo un po 'di più, penso che mi è venuta in una soluzione, anche se si spera che ci sia un modo migliore; questo sembra un po 'strano.
ritorto ha una classe, ClientCreator
che viene utilizzato per la produzione di semplici collegamenti monouso. E, in teoria, fa quello che voglio; collega e restituisce un Deferred
che spara quando viene stabilita la connessione. Non pensavo che avrei potuto utilizzare questo, però, dal momento che avrei perso la capacità di passare argomenti al costruttore protocollo, e quindi non hanno modo di condividere lo stato tra le connessioni.
Tuttavia, ho appena capito che il costruttore non accetta ClientFactory
*args
di passare al costruttore protocollo. O almeno lo sembra; non c'è praticamente alcuna documentazione per questo. In tal caso, posso dare un riferimento alla mia fabbrica (o qualsiasi altra cosa, se la fabbrica non è più necessario). E torno al Deferred
che viene generato quando viene stabilita la connessione.