Мой дизайн для сервера сокета UDP правильный? - PullRequest
0 голосов
/ 07 октября 2010

Я проектирую сервер, который используется в UDP-коммуникации с использованием MFC.У меня есть следующие классы

  • CMyDlialog - Позаботьтесь о пользовательском интерфейсе
  • CController - Действуйте как посредник между всеми классами
  • CProtocolManager - Позаботьтесь о кодировке /Декодирование сообщений (это статический класс)
  • CConnectionManager - Позаботьтесь о соединении UDP, отправке, получении

Я создаю объект CConnectionManager в качестве переменной-члена в CController и объектеCController как переменная-член в CMyDialog.

Когда пользователь вводит что-то и нажимает send, я вызываю метод в CControler, который вызывает метод в CProtocolManager для создания пакета и вызывает метод CConnectionManager для его отправки.

Когда я получаю некоторые данные, они обрабатываются в потоке CConnectionManager.Там я создаю локальный объект CController и вызываю метод, который передает данные в CProtocolManager для декодирования.

Теперь я хочу проинформировать пользовательский интерфейс о данных, как это должен делать CControler?я могу опубликовать сообщение в пользовательском интерфейсе, сделав дескриптор главного диалога глобальным, это правильный подход.

Также скажите мне, является ли этот дизайн правильным.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 07 октября 2010

Я думаю, что дизайн никогда не бывает правильным или неправильным, но вы можете оценить их в соответствии с некоторыми принципами, которые многие считают «хорошими» (см. Принципы ТВЕРДОГО ).

Ваш подход к отправке звучит разумно, но сделать Dialog глобальным для получения определенно считается "не очень хорошим". См. Голливудский принцип . Я предлагаю вам лучше передать метод обратного вызова вашему диспетчеру соединений, который является методом CController (который затем позволяет CProtocolManager декодировать его и вызывает другой метод обратного вызова из диалогового окна). Если обратные вызовы - это не то, что вам нужно, вы можете определить AbstractBaseClasses (ABC) как этот "AbstractMessageReceiver" с помощью метода

 virtual void receive(const char*, int length) = 0;

Затем вы можете реализовать эту ABC в CProtocolManager и передать это как "AbstractMessageReceiver *" в CConnectionManager, который затем вызывает

m_myMessageReceiver->receive(m_buffer, m_length);

или что-то подобное.

Этот подход уменьшает сцепление, намного более тестируем и увеличивает возможность повторного использования.

Кроме того, я согласен с Am, что вы должны подумать о своей модели потоков!

0 голосов
/ 07 октября 2010

Кажется, вы делаете все это в одном потоке. Поскольку для перемещения пакетов назад и вперед требуется время, рекомендуется выполнить трудоемкую работу в другом потоке и опубликовать состояние / результаты потока пользовательского интерфейса. (Или пользовательский интерфейс будет заморожен).

...