Есть поток - функция, в которой сокет принимает сообщения. Для того, чтобы отслеживать таймаут, в этом потоке я запускаю еще один поток timeoutTimer , выполняющий функцию таймера, который вызывает self.tmr_callback по истечении таймаута. Так вот, во-первых, если я пытаюсь в коллбэке закрыть сокет, он закрывается, но клиент почему-то не реагирует на это, считает, что соединение открыто, а во-вторых, как сделать так, чтобы при срабатывании таймера корректно закрыть соединение и выйти из потока listen_to_client?
Помогите новичку, плиз!
listenThread = Thread( target=self.listen_to_client, args=(client, address, self.on_receive_callback, self.on_disconnected_callback) ) def tmrCallBack (client): client.close() print ('Timer callback called') def listen_to_client(self, client, address, on_receive_callback, on_disconnected_callback): # set a buffer size ( could be 2048 or 4096 / power of 2 ) size = 1024*1024 timeoutTimer = WatchdogTimer (5.0, self.tmr_callback, args=(client,), daemon = True) timeoutTimer.start() while True: try: d = client.recv(size) self.currentClient = client timeoutTimer.restart() if d: #messages = d.split(b'\n\r') messages = d.split(b'\0') for data in messages: if data: data = data.decode('utf-8') if self.debug: print(datetime.now(), self.serverName, 'CLIENT Data Received', address) if not self.debug_data: print('\n') if self.debug_data: print(data, '\n') if on_receive_callback: try: on_receive_callback(client, address, data) except Exception as e: if self.debug: print(datetime.now(), 'CLIENT Receive Callback Failed:', data, '\n', e, '\n') else: raise ValueError('CLIENT Disconnected') except Exception as e: if self.debug: print(datetime.now(), e, client, '\n') timeoutTimer.cancel() client.close() client_index = self.clients.index(client) self.clients.pop(client_index) if on_disconnected_callback: try: on_disconnected_callback(client, address) except Exception as e: print('on_close_callback failed\n', e, '\n') return False