2017-01-19 12 views
0

私はクライアントに、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番目のハンドシェイクを受信しませんでした。クライアントはと思われますが、と接続しています。

私は間違っていますか?なぜこれが起こっているのでしょうか?

答えて

0

私はねじれたエキスパートではなく、あなたが間違っていることを本当に伝えることができませんが、私は現在、プロジェクトでオートバンと仕事をしていますが、ReconnectingClientFactoryを使って再接続の問題を解決しました。おそらくあなたは、AutobahnでReconnectingClientFactoryを使用しているもののうち、examplesを確認したいでしょう。