Es ist nicht so schwer, sich selbst zu tun.
Zuerst müssen Sie das zu verwendende Protokoll definieren. Es kann sehr einfach sein; wie nur ein Nachrichtentypfeld, ein Nutzlastgrößenfeld und die tatsächliche Nutzlast. Die Nachrichtentypen, die Sie benötigen, sind SUBSCRIBE
, UNSUBSCRIBE
und PUBLISH
. Die Payload für die Nachrichten SUBSCRIBE
und UNSUBSCRIBE
ist der Name eines Channels zum Abonnieren/Abbestellen. Die Payload für die PUBLISH
Nachricht ist der Kanalname und die tatsächlichen Daten (natürlich zusammen mit der Größe der Daten).
Um alle Teilnehmer zu verbinden, benötigen Sie einen zentralen Server. Alle Abonnenten/Publisher müssen eine Verbindung zu diesem Server herstellen. Das Serverprogramm führt eine Sammlung von Warteschlangen, eine für jeden Kanal. Wenn eine Subskribierungs- oder Veröffentlichungsnachricht für einen Kanal, der nicht existiert, beim Server eintrifft, erstellen Sie eine neue Nachrichtenwarteschlange für diesen Kanal. Für jeden Kanal benötigt der Server auch eine Sammlung aller Clients, die diesen Kanal abonniert haben. Wenn eine Veröffentlichungsnachricht beim Server ankommt, wird sie am Ende der Warteschlange für den betreffenden Kanal hinzugefügt. Während eine Kanalwarteschlange nicht leer ist, senden Sie eine Kopie davon an alle Abonnenten für diesen Kanal, und wenn alle diese empfangen haben, kann die Nachricht aus der Warteschlange entfernt werden.
Der harte Teil des Servers wird wahrscheinlich der Kommunikationsteil sein. Der einfache Teil werden alle Warteschlangen und Sammlungen, wie Sie die C++ standard containers für alle von ihnen verwenden können (zB std::queue
für die aktuelle Warteschlange, std::unordered_map
für Kanäle und std::vector
für die Sammlung von angeschlossenen Clients.)
Die Kunden sind sehr Es ist einfach, die Subskriptions- und Veröffentlichungsnachrichten an den Server zu senden und die Veröffentlichungsnachrichten vom Server zu empfangen. Der schwierige Teil wird wieder der eigentliche Kommunikationsteil sein.
Nachsatz:
Ich habe eigentlich nie ein solches System aufgebaut mein Selbst, alle der oben genannten nur direkt von der Spitze von meinem Kopf war. Ein erfahrener Programmierer sollte nicht mehr als ein paar Stunden brauchen, um die Grundlagen zu implementieren, vielleicht ein paar Tage für einen unerfahrenen Programmierer.
Für die Kommunikation könnten Sie z.B. Boost ASIO, verwenden Sie möglicherweise einen threads pro Kanal. Und Sie können etwas wie Boost property tree verwenden, um Nachrichten JSON oder XML zu konstruieren/parsen.
All dies ist jedoch eine Art Rad neu erfinden, wenn Sie wahrscheinlich in ein paar Stunden eines der bestehenden Systeme wie RabbitMQ verwenden könnten, sparen Sie eine Menge Zeit (und eine Menge Fehler!)
Benötigen Sie eine Lib oder einen Dienst? Oder könnten Sie, unter den Voraussetzungen, nur Steckdosen oder Rohre verwenden? Das wäre wahrscheinlich effizienter für eine Himbeere. –
ZeroMQ ist sehr einfach zu bedienen. – Kimi
@ dema80: Ich bevorzuge Service, aber lib ist in Ordnung. Können Sie Steckdosen für Geräte verwenden? – Yoshi