code: def send_message(self, msg_id, msg_data):
          
          if self._error.has_error() or self._force_close_time > 0:
              return False
  
          byte_msg = self.message_packer.pack(msg_id, msg_data)
          length = struct.calcsize(self.__class__.message_packer.size_fmt) + len(byte_msg)
  
          if length > self.__class__.max_message_size:
              raise MessageSizeOverflowError(msg_id, length, self.__class__.max_message_size)
  
          self._out_buffer += struct.pack(self.__class__.message_packer.size_fmt, length)
          self._out_buffer += byte_msg
          return True
docs: msg_data can be None