私はクライアントに、ws
プロトコルで常にサーバーに接続する必要があります。さまざまな理由から、接続が時々落ちます。これは受け入れられますが、それが起こったときに私のクライアントが再接続したいと思います。オートバン+ツイストの再接続
現在のところ、私の一時的な回避策は、親プロセスにクライアントを起動させ、接続が切断されたことを検出した時点で終了します(クライアントは重要なデータを処理しません。sigkill
を実行しても問題ありません) 。これは仕事ですが、私は実際の問題を解決することを非常に好むでしょう。
これは大体私のクライアントです:
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
このコードは正しくそれが再接続しようとした時点で、最初の接続のドロップまで、クライアントの作業を行います。プロセス中に例外は発生しません。すべてが正しくクライアントに送信され、onConnect
が呼び出され、新しいmainloop
が開始されますが、サーバーはその2番目のハンドシェイクを受信しませんでした。クライアントはと思われますが、と接続しています。
私は間違っていますか?なぜこれが起こっているのでしょうか?