With client to server communications there are always a number of approaches.
The best approach I've found is to use some of the more advanced binding in WCF.
When you create a WCF service in .Net you can assign multiple binding types to the server so you can expose the same service as a TCP/IP network server and web service all at the same time.
With client server communications it's always best if the client initiates the handshake as you may find it difficult to get your client to open an incoming port to allow your server to start the conversation with the client.
With some of the more advanced bindings in WCF they support something called duplexing. This means the client can establish the connection, but once established the server can push messages out the client as well as the client to the server.
Here is a CodeProject article on duplexing with WCF
WCF Service Form Hosting and Duplex Communication