Ответ 1
Это не так уж сложно сделать на самом деле.
Прежде всего вам нужно определить используемый протокол. Это может быть очень просто; как поле типа сообщения, поле размера полезной нагрузки и фактическая полезная нагрузка. Для типов сообщений вам нужны SUBSCRIBE
, UNSUBSCRIBE
и PUBLISH
. Полезная нагрузка для сообщений SUBSCRIBE
и UNSUBSCRIBE
- это название канала для подписки на/отписки от. Полезной нагрузкой для сообщения PUBLISH
является имя канала и фактические данные (вместе с размером данных, конечно).
Для подключения всех абонентов вам нужен центральный сервер. Все подписчики/издатели должны подключиться к этому серверу. Программа сервера хранит набор очередей, по одному для каждого канала. Когда сообщение подписки или публикации поступает на сервер для канала, который не существует, создайте новую очередь сообщений для этого канала. Для каждого канала серверу также нужна коллекция всех клиентов, которые подписываются на этот канал. Когда сообщение публикации поступает на сервер, оно добавляется в конец очереди для рассматриваемого канала. Пока очередь каналов не пуста, отправьте ее копию всем подписчикам для этого канала, и когда все они ее получили, сообщение может быть удалено из очереди.
Жесткая часть сервера, вероятно, будет частью связи. Легкой частью будут все очереди и коллекции, так как вы можете использовать стандартные контейнеры С++ для всех из них (например, std::queue
для текущей очереди std::unordered_map
для каналов, а std::vector
для коллекции подключенных клиентов.)
Клиенты очень просты, все, что нужно сделать, это возможность отправлять подписку и публиковать сообщения на сервере и получать сообщения публикации с сервера. Твердая часть снова станет фактической коммуникационной частью.
Постскриптум:
Я никогда не строил такую систему самостоятельно, все вышеизложенное было прямо на моей голове. У опытного программиста не должно быть больше двух часов, чтобы реализовать основы, возможно, пару дней для неопытного.
Для связи, которую вы могли бы использовать, например. Boost ASIO, возможно, используйте один потоки для каждого канала. И вы можете использовать что-то вроде Дерево свойств Boost для создания/разбора JSON или XML.
Тем не менее, все это как бы заново изобретает колесо, когда вы, вероятно, можете начать использовать одну из существующих систем, таких как RabbitMQ, через пару часов, экономя много времени (и много ошибок!)