You really face a long journey!
Should the Server tell the clients which ClientID they have?
On the server side you should have these abilities:
Send to everyone connected
Send only to some specific connection
If you don't have that sorted out, you'll have trouble.
Should the Server tell the clients which ClientID they have?
It's your choice. The server can "choose all the IDs" or the clients can "choose their own id".
A simple approach is: when a client is launched, just create a UUID and use that. So, in this example the client is choosing their own ID. The first communication to the server is something like "hi, my uuid is2i23u4y2i34u2y4ui and my user's name is Jane Jones". On the server side, keep track of all the uuids and connections and nicknames, etc etc.
(If you're not already familiar with math concepts like UUIDs, you face a long journey.)
As I say, it's your choice. The server can "choose all the IDs" or the clients can "choose their own id".
"How would i go about spawning and moving other clients gameobjects etc
Well in clientA you'd have a function called something like "SpawnARobot(position)"
When commands arrive at clientA, you'll parse the commands. You'll have a big switch statement to know how to handle various commands. One of your commands might be "spawn" and when clientA receives a "spawn" command clientA would call "SpawnARobot(position)"
Here's literally an example of some commands (ie, just some text) arriving, and then the relevant functions/whatever being called:
Note that you have some really basic concepts to work out.
In some games only the server "decides" that something is spawned, or, whatever. The clients are completely dumb and essentially just "display what they are told".
In other games the server doesn't really do anything other than pass around commands, and, the clients themselves "decide" that something should be spawned, or, whatever. (That is often an "rpc" approach.)
Also don't forget there is a HUGE basic confusion between ... say you have three iPhones playing your Game. We speak of a "server" (call it a "master controller") which is one of those three iPhones, so each GameOnAnIPhone has your "client" but one (only) is also the "server" (or "master controller"). In complete contrast to that you can have literally "a server" in the cloud, ie your code (very likely Node.js) running on an AWS instance, and all three GameOnAnIPhones connect to the "server server".
All of these concepts are incredibly different, you have to sort out these basics I'm afraid.