Hi,
A while ago I made a multi user gaming engine that consisted of a server and many clients; I came across the same problem as you.
Before I go into detail, will your universe be having 3d objects added and removed from it throughout its use?? (ie, will a person have to appear if someone logs in, will a building have to appear if someone builds it, etc...)
Many networked games (ie on the playstation) have the 3d universe (world) built within the client, therefore, each client will not have to download the universe from a server (which helps towards bandwidth usage). All the server does is pass messages to and from each client.
When I made my multi user games engine I tried streaming the universe to each client, because the universe would be constantly getting larger, however, you do not need to do this. Here's my suggestion:
Each client has a basic 3d universe, which possibly contains the ground, sky, etc.. all the basic features. Also, have a library of 3d objects which the client has access to all the time, and upon login the server can stream some sort of file containg a map of the 3d universe and what and where objects need to go. if someone else logs in on a different computer, that client will pass a message to the server which in turns relays the message to all the other clients that are logged, telling them where the newly logged user is and what 3D object they are. Each client then independantly loads that 3D object into the universe (scenegraph is more precise).
If and when new objects appear in the library the server can pass out a message to each client telling them that a new object has arrived, then each client can download the object from the server (I would suggest have this as a text file which your client can load in and convert into a 3D object).
By doing this each client can use there bandwidth to the full for the actual game play (or whatever you client server app is doing) instead of using it to download large scenegraphs and 3d objects.
Hope this helps
J-Ware



