BRS#
|
Aplikace pro rezervaci místenek v autobusových spojích je ze své podstaty typu server-klient, tedy má centrální úložiště dat, ke kterému přistupují operátoři na jednotlivých terminálech. Z toho plyne, že implementace musí řešit otázku komunikace mezi procesy. Operační systémy k tomu poskytují různé prostředky s různými vlastnostmi. Zmíníme alespoň některé:
WM_COPYDATA
mezi okny. V rámci projektu byly implementovány třídy pro komunikaci pomocí protokolu TCP.
Databáze je reprezentována instancí třídy MemoryDb, požadavky se vyřizují přes rozhraní IQuery. Případné jiné implementace databáze v budoucnu musí používat stejné rozhraní, vnitřní struktura ale může být libovolná.
Terminálová část je vybavena vnitřní logikou, ale veškerou svou činnost vykonává pomocí elementárních příkazů, které poskytuje databázové rozhraní. V konfiguraci server-klient, kdy terminálová část je v jiném procesu (případně na zcela jiném počítači) je potřeba zajistit přenos požadavků z klienta na serverovou část a vrátit požadovaný výsledek dotazu.
Parametry dotazu stejně jako jeho výsledky jsou převedeny do binární podoby, která je nezávislá na způsobu přenosu informací mezi procesy. Převod do tohoto binárního formátu a zpět zajišťuje dvojice tříd - ClientProcess na klientské straně a ServerProcess na straně serveru. První z nich implementuje rozhraní IQuery, druhá pak zajišťuje volání odpovídající metody téhož rozhraní implementované databáze, což znázorňuje i následující obrázek.
Dvojice právě zmíněných sesterských tříd odstiňuje zbytek aplikací od detailů implementace meziprocesové komunikace (IPC) i odlišností vyplývajících z rozličných vlastností jednotlivých druhů transportu. Z hlediska klientského rozhraní je přenos dat mezi procesy naprosto transparentní. Výhodou je mj. skutečnost, že vlastní serverová aplikace může implementovat i přímo připojeného klienta, minimálně však je takové uspořádání výhodné při ladění a testování funkčnosti jak vlastní databáze, tak klientské části - v rámci jednoho procesu je vše přirozeně jednodušší.
Již bylo zmíněno výše jako transportní protokol byl vybrán TCP.
Klientů může být přirozeně připojeno více najednou, celá serverová část pracuje ve vícevláknovém režimu.
Parametry volání funkcí databázového rozhraní musí být pro přenos mezi procesy převedeny do binární podoby. To samé platí pro přenos návratových hodnot metod a parametrů opačným směrem.
Při volání funkce (statické metody třídy) se jednotlivé parametry ukládají za sebou dle těchto pravidel:
int
s hodnotou dle výčtového typu QueryCmd
, uint
, bool
s hodnotou true
a false
, uint
před samotnými daty, uint
) následovaný jednotlivýni položkami.Pro návratové hodnoty platí prakticky totéž s tím, že místo čísla metody má první položka význam návratové hodnoty metody.
Při vzdáleném volání databázových dotazů může docházet k chybám, jejich příčiny mohou být značně různorodé:
Chyby výše zmíněných typů jsou zachyceny ve třídě ClientApp. Pomocí uživatelkého rozhraní je vypsána odpovídající chybová hláška.