docs: def flush(self):
          '''
          Flushes the buffer to socket. Only call when the write is done. Calling flush after each write will prevent the buffer to act as efficiently as possible
          '''
          # return if empty
          if self.__bufferidx == 0:
              return 
          # send here the data
          self.conn.send("%s\r\n" % hex(self.__bufferidx)[2:])
          self.conn.send("%s\r\n" % ''.join(self.__buffer[0:self.__bufferidx]))
          # reset buffer index = 0 (beginning of the buffer)
          self.__bufferidx = 0