class Handler(threading.Thread): def __init__(self, address, socket): super().__init__() self.address = address self.socket = socket self.controller = Controller() def run(self): print(f'Connected to {self.address}') buffer = b'' flag = True while flag: try: data = self.socket.recv(Constants.RECV_SIZE) except socket.timeout: print('TIMEOUT') print('break 4') break if data: buffer += data # Split buffer to messages, removing the trail empty. for match in re.finditer(b'(.*?)(?:\a\b)', buffer): self.socket.settimeout(self.controller.get_timeout()) message = match.group(1).decode("utf-8") print(f'--- MESSAGE = "{match.group(1)}"', buffer, message) # Remove the message from buffer (including \a\b). buffer = buffer[len(message) + 2:] response, is_last = self.controller.process(message) print('DONE') if response == Constants.SERVER_INTERNAL_RECHARGING: print('xxx recharging') self.socket.settimeout(self.controller.get_timeout()) continue elif response == Constants.SERVER_INTERNAL_FULL_POWER: print('xxx full') continue self.socket.send(response.encode()) print(f'SENDING = "{response.encode()}"') if is_last: flag = False print('break 1') break else: if buffer[-1:] == b'\a': print('AAAAA', self.controller.state, buffer) if self.controller.is_message_long( buffer[:-1].decode("utf-8")): message = buffer[:-1].decode('utf-8') if message == Constants.CLIENT_RECHARGING or message == Constants.CLIENT_FULL_POWER: continue print('break 5') self.socket.send( Constants.SERVER_SYNTAX_ERROR.encode()) flag = False break elif self.controller.is_message_long( buffer.decode("utf-8")): message = buffer.decode('utf-8') if message == Constants.CLIENT_RECHARGING or message == Constants.CLIENT_FULL_POWER: continue print('break 6') self.socket.send( Constants.SERVER_SYNTAX_ERROR.encode()) flag = False break else: print('break 2') break print('Disconnecting.') self.socket.close()