Использование модели тяги, упомянутой Джошем, - самый простой подход. Прежде всего, вы преодолеете множество проблем с безопасностью. Не нужно беспокоиться о клиентских брандмауэрах. Кроме того, вам не нужно беспокоиться о необходимости открытия одного и того же порта на каждом клиенте или открытия динамических портов и уведомления сервера о том, какой порт на каком клиенте используется.
Кроме того, вам не нужно будет вести список подписчиков на сервере. Кроме того, вам не нужно беспокоиться об очистке списка подписчиков, если клиент отключается не очень чистым способом (сбой приложения, сбой питания и т. Д.).
По сути, простой опрос клиента на службу на сервере - это самый простой и чистый подход, ИМХО. Я использовал это несколько раз. Вы даже можете настроить интервал опроса, если захотите.
Edit:
Хотя я не могу предоставить ссылку или пример кода, я опишу, что я делал в прошлом.
По сути, у меня был веб-сервис, который при запросе возвращал бы состояние системы. Этот веб-сервис явно работает на сервере. При запуске клиенты запускают отдельный поток, который каждые 30 секунд будет запрашивать веб-службу, чтобы узнать состояние серверной системы. Затем пользовательский интерфейс будет обновлен, чтобы указать это состояние. После выполнения этой задачи поток вернется в режим ожидания на 30 секунд. Время обновления можно было настроить с помощью файла конфигурации. Просто убедитесь, что ошибки перехватываются, чтобы в случае сбоя запроса к службе по причине, не связанной с отключением сервера, все приложение не зависало.