2017-01-19 3 views
0

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?

Répondre

0

Je ne suis pas un expert tordu et ne peux pas vraiment dire ce que vous faites mal, mais je travaille actuellement avec Autobahn dans un projet et j'ai résolu les problèmes de reconnexion en utilisant le ReconnectingClientFactory. Peut-être que vous voulez vérifier quelques examples de l'utilisation de ReconnectingClientFactory avec Autobahn.