System.Net.Sockets (ваш протокол будет на базе TCP) или библиотеки для WebSocket (ваш протокол будет на базе Websocket, который на базе TCP), библиотеки есть опен-сорсные.
приблизительно как
На первый взгляд просто, но если требуется длительное время держать подключение открытым то понадобится обеспечить keep-alive, а если еще и корректная обработка сбоев интернет-подключения, то еще придется реализовать повторные попытки подключения и чтение данных по частям (в буфер byte[]), для тестирования проблем с интернетом используйте программы вроде NetLimiter и напишите тест - код, который автоматически отключает текущую сеть когда пакет уже начал отправляться, или пока еще не начал.
для двух или болееудаленных клиентов от сервера?
А вот это не так сложно, просто применить многопоточность: создать поток на принятие клиентов, и на работу с каждым клиентом тоже свой поток.