2017-09-29 16 views
0

So habe ich einen Hauptserver in verdrehten geschrieben. Ich möchte einen Backup-Server auf einem anderen Port ausführen, wenn der erste Client eine Verbindung herstellt. Dieses Verhalten sollte nicht wiederholt werden, wenn der zweite Client eine Verbindung herstellt. Der Sicherungsserver sollte auch geschlossen werden, wenn der letzte Client die Verbindung trennt.
Wie kann ich dieses Verhalten implementieren? Momentan führe ich eine Batch-Datei aus, bevor der Reaktor startet. Aber das Problem ist, dass dies eine unendliche Schleife erzeugen würde. Aber ich gebe ein Argument, das es stoppen kann. Dies bedeutet jedoch, dass, wenn der Hauptserver ausfällt und der Backup-Server Clients annimmt, Backup-Server übrig sind.Führen Sie etwas, wenn der erste Client in twisted verbindet?

+0

Kann ich Ihnen helfen, mit der Antwort? –

+0

Ich arbeite daran. –

Antwort

0

Sie müssen die connectionMade und connectionLost Ereignisse des Twisted-Protokoll anschließen. In diesen können Sie Ihre Geschäftslogik implementieren.

Schauen Sie folgende Ereignisse auf:

from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
from twisted.internet import reactor 


class Protocol(LineReceiver): 

    def __init__(self, factory): 
     self.factory = factory 

    def connectionMade(self): 
     self.factory.clients.add(self) 
     print('Client added. count:', len(self.factory.clients)) 

    def connectionLost(self, reason): 
     self.factory.clients.remove(self) 
     print('Client removed. count:', len(self.factory.clients)) 

    def lineReceived(self, line): 
     self.transport.write(line) 


class MyFactory(Factory): 

    def __init__(self): 
     self.clients = set() 

    def buildProtocol(self, addr): 
     return Protocol(self) 


reactor.listenTCP(1520, MyFactory()) 
reactor.run() 

Sie diesen Server mit Telnet testen:

telnet 127.0.0.1 1520 
+0

Ich habe es größtenteils funktioniert. Eine abschließende Frage, sobald der Server bei 1520 aufhört zu laufen, wie mache ich den Client connect Verbindung zu dem neuen Server, den ich bei 1521 bin. Ich benutze die connectionLost() Methode auf dem Client-Code, innerhalb dessen ich selbst aufrufen .makeConnection (1521) dies löst den Rückruf connectionMade(), aber im nächsten Augenblick löst es clientConnectionLost Methode in twisted.internet.protocol.ClientFactory. Wie mache ich die neue Verbindung bestehen? –

+0

Erstellen Sie eine neue Frage mit Ihrem vorhandenen Code. Das wäre viel einfacher, Sie zu unterstützen. –

+1

https://stackoverflow.com/questions/46538287/reconnect-to-different-address-in-twisted –

Verwandte Themen