You are right that in the general-purpose library [*] there are two concepts (object name and message name) that can be used to direct the processing on the server side. These two concepts were intended to reflect and translate the object-oriented designs, where objects have methods - and where, in its pure theoretical form, methods are invoked by sending messages to objects.
So, the idea is that if you want your printer to print some document, then you send the message "print" to the object "printer". If you instead want the printer to shut down, you send the message "shutdown" to the same objec "printer" - but if you want to shut down the TV set instead, then you send the message "shutdown" to a different object, "tv" perhaps. This shows that both message names and object names can be used to differentiate the processing at the receiving side and they can be interpreted at different levels. The object name indicates who should handle the message, whereas the message name indicates the work to be done. This division is of course artificial, because you might as well achieve the same results with just a single directive, for example named "printer.print" or "printer.shutdown" or "tv.shutdown". But having two separate values instead of just one helps in some idioms like sending "shutdown" in a loop to all your known target devices - and this way of thinking is similar to how we design object-oriented systems. In the C++ analogy:
- object name is like an object pointer
- message name is like a member function pointer
That is, you need both of these values to get somebody to do something.
[*] But this is all a matter of convention. The general-purpose library is a high-level messaging library that proposes some set of programming idioms and ideas, like the one above, on top of a core library, which is more low-level and which does not impose any conventions. In the core library the message is composed of two parts: the header and the body, which can be both structured in any way. It is up to the client and the server to agree on how they interpret both parts and it is even OK to use empty headers if it is always understood what is the meaning of the message body. You might even build a more elaborate system, where the header will contain a lot more complex meta-data (example: security tokens). But the convention of using a pair of object name and message name seemed to be quite commonly understood in the software engineering world and that convention was implemented in the high-level library.
Hopefully this explains the rationale - let me know if there is anything that needs further discussion!