Шаблон проектирования наблюдателя немного отличается от того, что вы описываете:
Обратите внимание, что каждый наблюдатель получает уведомление от "наблюдаемого" объекта; так что если у вас есть сервер, который непрерывно передает данные, то ожидаете ли вы, что сервер «уведомит» вас, и о чем вы ожидаете, что сервер уведомит вас? Каждый пакет, который он отправляет вам? Каждый кусок пакетов?
Короче говоря: нет, вы не можете реализовать шаблон наблюдателя в клиент-серверном приложении. У сервера нет (простого) способа вызвать метод уведомления в клиентском приложении, и если ваш клиент отключится, он не будет отменен из наблюдаемого.
Итак, вернемся к вашему вопросу ... вы ограничены архитектурой: блокировка сокетов (tcp / udp) все работает блокированием, пока вы не получите данные. Как только вы получаете данные, вы должны выполнить цикл и снова вызвать прием, чтобы непрерывно получать больше данных. Альтернативой является использование асинхронных сокетов:
Асинхронная связь через сокет, вероятно, настолько близка, насколько вы приблизитесь к шаблону наблюдателя Кроме того, вы хотите использовать протокол UDP, потому что у вас есть потоковые данные, а UDP специально разработан для потоковой передачи данных. Если вы не хотите пропустить какие-либо пакеты (из-за ненадежности UDP), то вы можете использовать надежный UDP .