2017-09-30 3 views
0

Nach der Arbeit durch einige der grundlegenden tutorials, möchte ich meinen TCP/UDP-Client mit einem Code beenden, der angibt, ob es verbunden ist oder nicht. Der richtige Weg, einen Exit-Code in Verdrehte zurückzukehren:Wie übergebe ich Erfolg oder Misserfolg an den Aufrufer im Twisted-Framework?

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

Dann, wenn der Prozess beendet wird, ist es mit dem Code 0 verlassen wird eine normale Beendigung anzuzeigen. Wenn der Client stattdessen eine Zeitüberschreitung durchführt, anstatt erfolgreich eine Verbindung herzustellen, wie sollte er dann einen Wert zurückgeben, der dann an sys.exit anstelle der Konstante 0 übergeben werden kann?

+0

eine Funktion verwenden und 'return' den Exit-Code? –

Antwort

2

Feststellung, ob die TCP-Verbindung erfolgreich war oder wird dadurch erreicht, scheiterte nach dem Ergebnis der latenten dabei

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

Bei entsprechenden Implementierungen von connected und did_not_connect, sollten Sie einen geeigneten Wert zu einem nachfolgenden passieren können, sys.exit anrufen.

Zum Beispiel

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

Da ich auch UDP unterstützen muss, konnte ich keine Rückrufe verwenden (AFAICT, listenUDP gibt keine verzögerte Instanz zurück), also musste ich einen etwas anderen Ansatz wählen, der moralisch derselbe ist: füge die twisted.protocols.policies hinzu. TimeoutMixin zu den Protokollklassen, setze eine Instanzvariable in timeoutConnection() und lese die Instanzvariable im Aufruf sys.exit(). Dies beinhaltet leider, was ich vermeiden wollte, indem ich eine globale Instanz verwende, um den Zustand in Nicht-'_init__'-Methoden zu übergeben, aber es scheint nicht, als gäbe es noch eine andere Möglichkeit. – ceridwen

+0

UDP-Clients können keine Verbindung herstellen. listenUDP ist synchron erfolgreich. Ungeachtet dessen kann derselbe Ansatz, den ich in dieser Antwort skizziert habe, dazu verwendet werden, den globalen Zustand auch anderswo zu vermeiden. –

Verwandte Themen