2017-01-19 80 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啓動,但服務器從未收到第二次握手。儘管如此,客戶似乎認爲認爲它已連接。

我在做什麼錯?爲什麼會發生這種情況?

回答

0

我不是一個扭曲的專家,不能真正告訴你做錯了什麼,但我目前正在與一個項目中的高速公路工作,我解決了使用ReconnectingClientFactory重新連接問題。也許你想檢查一些examples與Autobahn使用ReconnectingClientFactory。