A menedzser önkényes üzenetek alapján a google protokollbufferekkel - kildekode

sandbox →

Volt egy szabad napot, és úgy döntöttem, hogy játszani körül a könyvtár google :: Protobuf. Ez a könyvtár lehetővé teszi, hogy kódolni és dekódolni a strukturált adatok. Alapján ezt a könyvtárat, építek egy egyszerű vezérlő, amely képes kezelni minden üzenetet. A szingularitás ez a vezérlő, hogy nem fogja tudni, milyen típusú üzeneteket továbbítani kell, és csak feldolgozni üzenetek segítségével a regisztrált rakodók.

Az ábrák rövid ismertetése Protobuf könyvtár


Tehát, először egy rövid pillantást google :: Protobuf könyvtár, akkor szállítjuk, két összetevőből áll:
Valójában, a könyvtári fejléc fájlokat +
Fájl Compiler * .proto - létrehoz a leírás állások egy C ++ osztály (mert lehetséges, hogy létrehoz más programozási nyelvek: Java, Python, stb)
Egy külön fájl jön létre leírását az üzenetet, amelynek az osztály jön létre, a szintaxis nagyon egyszerű:
Itt leírjuk ServerStatusAnswer üzenetet, amely két opcionális mezők:
  • THREADCOUNT - opcionális egész szám paraméter
  • hallgatók - egy opcionális karakterlánc, amely többször is megismételhető
Az itt megfelel például a következő üzenet:
Valójában Protobuf méret - egy bináris, itt hozok üzenetet olvasható formátumban csak az érthetőség kedvéért

A fordító automatikusan generál C ++ kódot sorozatprogramozásának deserialization ilyen üzeneteket. Protobuf könyvtár is biztosít további jellemzői: szerializációs egy fájlba, a folyamot egy pufferben.

ÉN használ CEllenõrizze a build rendszer, amely már megkapta a támogatást a Protobuf:
PROTOBUF_GENERATE_CPP - ez makró okoz fordítóprogram minden protoc * .proto fájlt, és létrehozza a megfelelő CPP és h fájlokat adunk a szerelvény.
Minden automatikusan történik, és nincs szükség külön felülést nem kell (a * nix szükség lehet még egy csomag szálak és a zászló linker).

Leírás menedzser


Úgy döntött, hogy megpróbálja, hogy írjon egy üzenetet vezetője, amelyikben egy üzenet kéri a megfelelő felvezető és választ küld a kapott üzenetet. Ebben az esetben a vezérlő nem tudja milyen típusú üzeneteket továbbítani neki. Ez akkor lehet szükséges, ha a vezérlő hozzáad vagy kivág megfelelő rakodók működés közben (például, betölteni a modell megfelelő tágulási, * .dll, * .so).

Annak érdekében, hogy feldolgozza az önkényes üzeneteket, mi kell egy osztály, amely kezeli elvont üzenetet. Nyilvánvaló, hogy ha leírjuk az üzeneteket * .proto fájl, a fordító generál a saját kategóriájában, de sajnos ezek mind örökölt google :: Protobuf :: Üzenet. Ebben az osztályban nehezen húzza az összes adatot a jelentés (ezt elvileg lehetséges, de aztán nem sok extra munkát), emellett nem tudjuk, hogyan hozunk létre a választ.
Ez jön a mentő, mondván: „Minden probléma megoldható bevezetésével további absztrakciós szinten, de a probléma a túl sok absztrakciós szintet.”
Meg kell elválasztani a meghatározása, hogy milyen típusú üzenetet az üzenet maga, meg tudjuk csinálni a következő módon:
Majd csomagolja üzenetünket egy másik üzenet:
  • Kötelező id mező egy egyedi azonosítót az üzenetet
  • nem kötelező adatok mező üzenetünket
Így a vezetője fogja keresni id mező megfelelő üzenet felvezető:
De most azt látjuk, hogy mindegyik felvezető kell végezni dekompressziós üzenetét minta :: proto :: Message in a saját üzenetét. És ez a folyamat lesz lemásolva az egyes kezelő. Azt akarjuk, hogy elkerüljék a párhuzamos kódot, hogy vegye a minta típusa Erasure. Ez a minta lehetővé teszi, hogy elrejtse a entitástípust kezelendő a közös felület, de minden egyes processzor fog működni egy bizonyos fajta, csak általa ismert.

Így a megvalósítása nagyon egyszerű:
Mi határozza meg a virtuális függvény eljárást. hanem adjunk egy virtuális függvény doProcess. amely már dolgozik a mi specifikus üzeneteket. Ezt a technikát alapul mechanizmusa sablon példányosıtási típusai egészül idején a tényleges használat a sablon helyett idején nyilatkozatot. Mivel ez az osztály örökli MessageProcessorBase, akkor nyugodtan továbbítja az örökösök ennek az osztálynak a mi vezetője. Továbbá meg kell jegyezni, hogy ez az osztály biztosítja sorozatprogramozásának deserialization mi konkrét üzeneteket és kivételt dob, ha hiba történik.

És végül, itt van egy példa segítségével ez a vezérlő, mondjuk van két féle üzenet:

Mint látható a leírás - az üzenet a kért adatokat a szerver a belső állapotát (ServerStatus), és egyszerűen visszaadja a lekérdezés (Echo). Végrehajtás rakodók magukat triviális, én csak végrehajtására ServerStatus:
Megvalósítás magát:
Itt van, hogyan működik:

Ui Ahhoz, hogy ezt a cikket írni használtuk:
  • gcc-4.4.5-linux
  • CEllenõrizze-2.8.2
  • növeljék-1.42
  • Protobuf-2.3.0

Példa fektetve GitHub