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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top