J'ai une série de clients qui doivent être connectés en permanence à mon serveur via le protocole ws
. Pour un certain nombre de raisons différentes, les connexions tombent parfois. C'est acceptable, mais quand cela arrive, j'aimerais que mes clients se reconnectent. Actuellement, ma solution de contournement temporaire est d'avoir un processus parent lancer le client et quand il détecte la chute de connexion, le terminer (le client ne gère jamais les données critiques, il n'y a pas d'effets secondaires) et réapparaître un nouveau client . Bien que cela fasse le travail, je préférerais de beaucoup régler le problème réel.Autobahn + reconnexion torsadée
C'est à peu près mon client:
from autobahn.twisted.websocket import WebSocketClientProtocol, WebSocketClientFactory
from twisted.internet import reactor
from threading import Thread
from time import sleep
class Client:
def __init__(self):
self._kill = False
self.factory = WebSocketClientFactory("ws://0.0.0.0")
self.factory.openHandshakeTimeout = 60 # ensures handshake doesnt timeout due to technical limitations
self.factory.protocol = self._protocol_factory()
self._conn = reactor.connectTCP("0.0.0.0", 1234, self.factory)
reactor.run()
def _protocol_factory(self):
class ClientProtocol(WebSocketClientProtocol):
def onConnect(self, response):
Thread(target=_self.mainloop, daemon=True).start()
def onClose(self, was_clean, code, reason):
_self.on_cleanup()
_self = self
return ClientProtocol
def on_cleanup(self):
self._kill = True
sleep(30)
# Wait for self.mainloop to finish.
# It is guaranteed to exit within 30 seconds of setting _kill flag
self._kill = False
self._conn = reactor.connectTCP("0.0.0.0", 1234, self.factory)
def mainloop(self):
while not self._kill:
sleep(1) # does some work
Ce code fait correctement le travail du client jusqu'à la première chute de connexion à quel point il tente de se reconnecter. Aucune exception n'est levée pendant le processus, il semble que tout se passe correctement côté client, le onConnect
est appelé et le nouveau démarre, mais le serveur n'a jamais reçu cette deuxième prise de contact. Client semble pense il est connecté, cependant.
Qu'est-ce que je fais mal? Pourquoi cela pourrait-il se produire?