2017-01-19 11 views
0

Ich habe eine Reihe von Clients, die ständig über ws Protokoll mit meinem Server verbunden werden müssen. Aus verschiedenen Gründen fallen die Verbindungen gelegentlich ab. Das ist akzeptabel, aber wenn es passiert, möchte ich, dass meine Clients sich wieder verbinden.Autobahn + Twisted Wiederverbinden

Derzeit ist meine temporäre Problemumgehung, einen übergeordneten Prozess den Client zu starten, und wenn es Verbindungsabbruch erkennt, beenden Sie es (Client verarbeitet keine kritischen Daten, keine sigkill -Eigenschaften) und einen neuen Client neu zu erstellen . Während dies den Job erledigt, würde ich sehr viel lieber das eigentliche Problem beheben.

Dies ist in etwa mein Kunde:

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 

Dieser Code-Client korrekt arbeiten, bis erste Verbindungsabfall an dem es wieder versucht zu Punkt macht. Keine Ausnahmen werden während des Prozesses ausgelöst, es scheint, dass alles ordnungsgemäß clientside ging, die onConnect wird aufgerufen und neue mainloop startet, aber der Server erhielt nie diesen zweiten Handshake. Client scheint zu denken es ist verbunden, obwohl.

Was mache ich falsch? Warum konnte das passieren?

Antwort

0

Ich bin kein verdrehter Experte und kann nicht wirklich sagen, was Sie falsch machen, aber ich arbeite gerade mit Autobahn in einem Projekt und löste die Wiederverbindungsprobleme mit der ReconnectingClientFactory. Vielleicht möchten Sie einige examples der Verwendung von ReconnectingClientFactory mit Autobahn überprüfen.

Verwandte Themen