Anyway on MSDN it says:
So I thought checking DataAvailable would never throw a exception/block the thread unless the remote (client closes the connection) - but that wont happen anyway because Ive handled graceful disconnects.
Use the DataAvailable property to determine if data is ready to be read. If DataAvailable is true, a call to Read returns immediately. If the remote host shuts down or closes the connection, DataAvailable may throw a SocketException.
For point 2: the client would eventually get disconnected from the server either way (say if a NPC moved nearby). On the client side a latency message is sent every 500ms so they would loose connection always if the servers drops.
Regarding having only one single thread: I just didn't want to create a new thread for each new client (255 clients mean 255 threads). Do you think it is safe to use the .net Task Parallel Libraries on the main thread if it is needed? I am also planning to move to .net 4.5 and make extensive use of the new .net Async methods soon. Ill just slap a async keyword on every method that has a chance to block.
Thanks for reply's btw, really helps