Exemplo n.º 1
0
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()