2017-09-30 5 views
0

Après avoir travaillé avec certains des tutorials de base, je veux que mon client TCP/UDP quitte avec un code indiquant s'il est connecté ou non. La bonne façon de retourner un code de sortie dans Twisted est:Comment faire passer la réussite ou l'échec de la connexion à l'appelant dans le cadre Twisted?

point = TCP4ClientEndpoint(reactor, "localhost", 1234) 
d = connectProtocol(point, ClientProtocol()) 
reactor.run() 
sys.exit(0) 

Ensuite, lorsque le processus se termine, il se termine avec le code 0 pour indiquer une fin normale. Si le client expire à la place au lieu de se connecter avec succès, comment doit-il transmettre une valeur à sys.exit au lieu de la constante 0?

+0

Utilisez une fonction et 'return' le code de sortie? –

Répondre

2

Déterminer si la connexion TCP a réussi ou échoué est accompli en assistant au résultat des droits différés:

d = connectProtocol(point, ClientProtocol()) 
d.addCallbacks(
    connected, 
    did_not_connect, 
) 

Avec des implémentations appropriées de connected et did_not_connect, vous devriez être en mesure de transmettre une valeur appropriée à la suite sys.exit appel.

Par exemple,

class Main(object): 
    result = 1 

    def connected(self, passthrough): 
     self.result = 0 
     return passthrough 

    def did_not_connect(self, passthrough): 
     self.result = 2 
     return passthrough 

    def exit(self): 
     sys.exit(self.result) 

main = Main() 
d = connectProtocol(point, ClientProtocol()) 
d.addCallbacks(
    main.connected, 
    main.did_not_connect, 
) 
reactor.run() 
main.exit() 
+0

Parce que je dois aussi supporter UDP, je ne pouvais pas utiliser les callbacks (AFAICT, listenUDP ne renvoie pas d'instance Deferred), donc j'ai dû adopter une approche légèrement différente qui est moralement la même: ajouter les twisted.protocols.policies. TimeoutMixin pour les classes de protocole, définissez une variable d'instance dans timeoutConnection() et lisez la variable d'instance dans l'appel sys.exit(). Cela implique malheureusement ce que j'espérais éviter, en utilisant une instance globale pour passer l'ensemble d'états dans des méthodes non-'_init__', mais il ne semble pas qu'il y ait une autre façon de le faire. – ceridwen

+0

Les clients UDP ne parviennent pas à se connecter de manière significative. listenUDP réussit de manière synchrone. Quoi qu'il en soit, la même approche que celle décrite dans cette réponse peut être utilisée pour éviter aussi l'état global ailleurs. –