Как реализовать потоковую передачу данных шаблона проектирования наблюдателя в C ++? - PullRequest
2 голосов
/ 30 июля 2011

Я хотел бы отправлять данные с сервера клиенту непрерывно (в потоковом режиме), не требуя от клиента непрерывного просмотра и проверки любых данных.Я думаю, что я прав, полагая, что это шаблон дизайна наблюдателя?Как это возможно?

Может ли кто-нибудь предоставить мне список вещей, которые я могу гуглить?Как реализован аспект шаблона наблюдателя?

Спасибо

Ответы [ 3 ]

3 голосов
/ 30 июля 2011

Шаблон проектирования наблюдателя немного отличается от того, что вы описываете:

enter image description here

Обратите внимание, что каждый наблюдатель получает уведомление от "наблюдаемого" объекта; так что если у вас есть сервер, который непрерывно передает данные, то ожидаете ли вы, что сервер «уведомит» вас, и о чем вы ожидаете, что сервер уведомит вас? Каждый пакет, который он отправляет вам? Каждый кусок пакетов?

Короче говоря: нет, вы не можете реализовать шаблон наблюдателя в клиент-серверном приложении. У сервера нет (простого) способа вызвать метод уведомления в клиентском приложении, и если ваш клиент отключится, он не будет отменен из наблюдаемого.

Итак, вернемся к вашему вопросу ... вы ограничены архитектурой: блокировка сокетов (tcp / udp) все работает блокированием, пока вы не получите данные. Как только вы получаете данные, вы должны выполнить цикл и снова вызвать прием, чтобы непрерывно получать больше данных. Альтернативой является использование асинхронных сокетов:

Асинхронная связь через сокет, вероятно, настолько близка, насколько вы приблизитесь к шаблону наблюдателя Кроме того, вы хотите использовать протокол UDP, потому что у вас есть потоковые данные, а UDP специально разработан для потоковой передачи данных. Если вы не хотите пропустить какие-либо пакеты (из-за ненадежности UDP), то вы можете использовать надежный UDP .

0 голосов
/ 30 июля 2011

Как я понимаю, основная проблема здесь заключается в том, что клиентское приложение не должно блокироваться в ожидании данных с сервера.Для этого вы можете создать один поток, который будет воздействовать на события сокета.Вы можете зарегистрировать контекст своего класса с этим модулем потока, и всякий раз, когда данные получены, этот модуль потока может сделать обратный вызов (уведомление), используя зарегистрированный контекст.

0 голосов
/ 30 июля 2011

Невозможно реализовать шаблон наблюдателя для варианта использования клиент / сервер, поскольку протокол связи совершенно другой.(RPC может быть подходящим, но вы используете TCP, так что)

В любом случае, у вас есть специальный TCP-клиент для приема данных.Именно этот TCP-клиент и ваш внутренний класс могут совместно реализовать шаблон Observer.При этом вашему классу больше не придется ждать (опрос) данных.

Shash

...