Pregunta

Esto es parte de un programa más grande; Voy a explicar sólo las partes pertinentes. Básicamente, mi código quiere crear una nueva conexión a un host remoto. Esto debería devolver un diferido, el cual se activa una vez establecida la conexión, por lo que puede enviar algo en él.

Estoy creando la conexión con twisted.internet.interfaces.IReactorSSL.connectSSL. Esto exige buildProtocol en mi ejemplo ClientFactory para obtener un objeto nueva conexión (twisted.internet.protocol.Protocol), y devuelve un twisted.internet.interfaces.IConnector. Cuando se inicia la conexión, Twisted llama startedConnecting en la fábrica, lo que le da la IConnector. Cuando la conexión se hace realmente, devolución de llamada connectionMade del protocolo se llama, sin argumentos.

Ahora, si sólo necesitaba una conexión por cada host / puerto, el resto sería fácil. Antes de llamar a connectSSL, me gustaría crear un diferido y lo puso en un diccionario enchavetado en (host, puerto). Luego, en connectionMade del protocolo, que podría utilizar self.transport.getPeer() para recuperar el host / puerto, lo utilizan para buscar el diferido, y el fuego de sus devoluciones de llamada. Pero esto, obviamente, se descompone si quiero crear más de una conexión.

El problema es que no puedo ver ninguna otra manera de asociar un diferidos creé antes de llamar connectSSL con el connectionMade más adelante.

¿Fue útil?

Solución

En cuanto a este un poco más, creo que he llegado a una solución, aunque es de esperar que hay una manera mejor; esto parece un poco raro.

Twisted tiene una clase, ClientCreator que se utiliza para la producción de conexiones simples de un solo uso. Que, en teoría, hace lo que yo quiero; conecta y devuelve un Deferred que se activa cuando se establece la conexión. No pensé que podría utilizar esto, sin embargo, ya que perdería la capacidad de pasar argumentos al constructor de protocolo, y por lo tanto no hay manera de compartir el estado entre las conexiones.

Sin embargo, me he dado cuenta de que el constructor ClientFactory sí acepta *args para pasar al constructor protocolo. O por lo menos se parece a ella; prácticamente no hay documentación de este. En ese caso, puedo darle una referencia a mi fábrica (o cualquier otra cosa, si la fábrica ya no es necesario). Y que vuelva la Deferred que se activa cuando se establece la conexión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top