2013-08-12 5 views
0

У меня есть клиент asyncore, который взаимодействует с сервером, написанным на C. Мне нужно уметь обнаруживать, когда сервер закрывает соединение и продолжает пытаться подключиться до тех пор, пока он не будет снова доступен. Вот код, который у меня есть: Это мой асинхронный клиент, который я запускаю, запускает другой потоковый модуль (ReceiverBoard) для запуска в отдельном потоке. класс DETClient (asyncore.dispatcher):Как восстановить соединение asyncore с сервером (решено)

buffer = "" 
t = None 

def __init__(self, host, port): 

    asyncore.dispatcher.__init__(self) 
    self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.connect((host,port)) 
    self.host=host 
    self.port=port 
    self.t = ReceiverBoard(self) 
    self.t.start() 

def sendCommand(self, command): 
    self.buffer = command 

def handle_error(self): 
    self.t.stop() 
    self.close() 

def handle_write(self): 
    sent=self.send(self.buffer.encode()) 
    self.buffer="" 

def handle_read(self): 
    ##there is code here to parse the received message and call the appropriate 
    ##method in the threaded module ReceiverBoard 

Моя первая проблема в том, что я хотел клиента (выше), чтобы попытки подключения к серверу (разработанный в ANSI C) через гнездо, пока соединение не было сделано ,

+0

хадж Ehsan, пожалуйста, напишите здесь ваш код и добавьте, что вы пробовали. – AliBZ

+0

haj ali, спасибо миллион человек. Поблагодарили бы за вашу помощь. –

+0

haj Ali, спасибо. Я случайно нашел решение. –

ответ

0

Изменение, которое я сделал, состояло в том, чтобы переопределить метод handle_error в asyncore выше, чтобы просто вызвать другой метод, чтобы попытаться инициализировать соединение снова, а не закрывать сокет. Как и в ниже: (Следующий код добавляется к DETClient выше)

def initiate_connection_with_server(self): 
    print("trying to initialize connection with server...") 
    asyncore.dispatcher.__init__(self) 
    self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
    self.connect((self.host,self.port)) 

def handle_error(self): 
    print("problem reaching server.") 
    self.initiate_connection_with_server() 

Это решает проблему сервер не доступны, когда этот код выполняется. Вызывается исключение и вызывается handle_error, который просто вызывает метод initiate_connection и пытается снова открыть сокет. Кроме того, после того, как соединение было первоначально установлено, код вызовет handle_error, если сокет потерян по какой-либо причине, и будет предпринята попытка восстановить соединение. Проблема решена!

Вот код для модуля с резьбой (ReceiverBoard)

class ReceiverBoard(threading.Thread): 
    _stop = False   
    def __init__(self, client): 
     self.client=client 
     super(ReceiverBoard,self).__init__() 
    def run(self): 
     while True: 
      block_to_send = "" 
      ##code here to generate block_to_send 
      self.client.sendCommand(block_to_send) 

    def stop(self): 
     self._stop = True 
Смежные вопросы