'Received a message-send.
Look up message based on object, unserialize the arguments, and
invoke it with args, and send an \'answer\' or \'error\' response.
@param findObjMethod: A callable which takes C{objectID} as argument.
@param requestID: The requiest ID.
@param objectID: The object ID.
@param message: The message.
@param answerRequired:
@param netArgs: Arguments.
@param netKw: Keyword arguments.'

def _recvMessage(self, findObjMethod, requestID, objectID, message, answerRequired, netArgs, netKw):

    if (not isinstance(message, str)):
        message = message.decode('utf8')
    try:
        object = findObjMethod(objectID)
        if (object is None):
            raise Error('Invalid    Object    ID')
        netResult = object.remoteMessageReceived(self, message, netArgs, netKw)
    except Error as e:
        if answerRequired:
            if (isinstance(e, Jellyable) or self.security.isClassAllowed(e.__class__)):
                self._sendError(e, requestID)
            else:
                self._sendError(CopyableFailure(e), requestID)
    except:
        if answerRequired:
            log.msg('Peer    will    receive    following    PB    traceback:', isError=True)
            f = CopyableFailure()
            self._sendError(f, requestID)
        log.err()
    else:
        if answerRequired:
            if isinstance(netResult, defer.Deferred):
                args = (requestID,)
                netResult.addCallbacks(self._sendAnswer, self._sendFailureOrError, callbackArgs=args, errbackArgs=args)
            else:
                self._sendAnswer(netResult, requestID)
