class Connection(asyncore.dispatcher): def __init__(self, address, message_handler): asyncore.dispatcher.__init__(self) self._address = (address.host, address.port) self.logger = logging.getLogger("Connection{%s:%d}" % self._address) self._message_handler = message_handler self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.endpoint = None self.connect(self._address) self._write_queue = Queue() self._write_queue.put("CB2") self.input_buffer = "" self.message = ClientMessage(buff="") def handle_connect(self): self.logger.debug("Connected to %s", self._address) def handle_read(self): self.input_buffer += self.recv(BUFFER_SIZE) self.logger.debug("Read %d bytes", len(self.input_buffer)) # split frames while len(self.input_buffer) > 0: self.logger.debug("Reading the message") complete = self.read_from() if not complete: self.logger.debug("message is not complete") break self._message_handler(self.message) self.message = ClientMessage(buff="") def read_from(self): if len(self.input_buffer) < INT_SIZE_IN_BYTES: self.logger.debug("Frame size couldn't be read") return False self.message.buffer += self.input_buffer[0:INT_SIZE_IN_BYTES] self.input_buffer = self.input_buffer[INT_SIZE_IN_BYTES:] while len(self.input_buffer) > 0 and not self.message_complete(): to_read = self.message.get_frame_length() - len(self.message.buffer) self.logger.debug("Data to be read %s , buffer size : %s ", to_read, len(self.input_buffer)) if to_read > len(self.input_buffer): self.message.buffer += self.input_buffer self.input_buffer = "" return False else: self.message.buffer += self.input_buffer[:to_read] self.input_buffer = self.input_buffer[to_read:] return True def message_complete(self): return len(self.message.buffer) == self.message.get_frame_length() def handle_write(self): self._initiate_send() def handle_close(self): self.logger.debug("handle_close") self.close() def writable(self): return not self._write_queue.empty() def _initiate_send(self): try: item = self._write_queue.get_nowait() except Empty: return sent = self.send(item) self.logger.debug("Written " + str(sent) + " bytes") # TODO: check if everything was sent def send_message(self, message): message.add_flag(BEGIN_END_FLAG) self._write_queue.put(message.buffer) self._initiate_send()