How to get started learning client-server multiplayer with Unity

I have developed single-player Unity games before, but I have not yet learned specifically how to make an online client-server multiplayer game (NOT peer-peer). I want to learn how to connect a Unity game to a central server which can allow the client to call procedures on the server remotely. The game client will be accessing the server’s procedures every few seconds–no other client-server interaction necessary. I also want to be able to write these procedures myself. I’m not sure where to get started learning something like this, so I would like to be pointed in the right direction. Can someone please give me some links or book titles to get me started or at least tell me what I need to type into Google to cater to my specific needs? The answers that I think would give me a good foundation are to the questions:

~Will I need a server software solution or can I just upload code with the necessary procedures directly to the server?

~How is the connection between the Unity-based client and the server established?

~How is this connection protected so that hackers cannot abuse the server?

With a brief understanding of the above topics, I feel I will be able to better navigate myself in learning what I need to learn. Please refer me to any links, books, etc that would get me on the right track. Thank you in advance!

Some solutions are Unity based executables that run the server logic, other are external and don’t run inside Unity at all.

You use a networking library from Unity of your choice. E.g. uLink, Photon, Lidgren, System.Net.Sockets, etc. (There’s a long list to choose from.) You’re better off spending some time researching this rather than asking “which is the best one” because it depends on your use case.

Some solutions have built in authentication systems, others require you to build one on top. Obviously secure authentication involves some sort of cryptography and is a fairly complex topic. Once authenticated, it’s generally assumed that a remote network address + port (endpoint) at least identifies the user so you don’t need to encrypt any more information unless it’s sensitive.