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?