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ő
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).
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
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:
- gcc-4.4.5-linux
- CEllenõrizze-2.8.2
- növeljék-1.42
- Protobuf-2.3.0
Példa fektetve GitHub