2017-01-19 6 views
0

У меня есть серия клиентов, которые необходимо постоянно подключать к моему серверу через протокол ws. По ряду разных причин соединения иногда падают. Это приемлемо, но когда это произойдет, я хотел бы, чтобы мои клиенты снова подключались.Autobahn + перекрученное повторное подключение

В настоящее время мое временное обходное решение заключается в том, чтобы родительский процесс запускал клиент и когда он обнаружил падение соединения, прекратить его (клиент никогда не обрабатывает какие-либо критические данные, никаких побочных эффектов для 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

Я не извращенный эксперт и не могу сказать, что вы делаете неправильно, но я сейчас работаю с Autobahn в проекте, и я решил проблемы с повторным подключением, используя ReconnectingClientFactory. Возможно, вы хотите проверить некоторые из examples использования ReconnectingClientFactory с помощью Autobahn.

Смежные вопросы