Tipy a triky v Delphi, díl 169. – klient a server podruhé

Po minulém pokusu o první síťovou aplikaci budeme dnes v tématu pokračovat. Slíbili jsme si použití komponent Indy a trochu složitější aplikaci. Ukážeme si tedy, jak na serveru sledovat, co se děje na připojených klientských stanicích.

Dnešní příklad se opět skládá ze dvou kusů, klientské a serverové části aplikace. Ukážeme si jednoduchou úlohu, kdy na klientských počítačích spustíme aplikaci, která bude komunikovat se serverem. Serverová část bude umožňovat vyžádat si na klientech snímek pracovní plochy daného počítače. Program tak může využít například správce sítě LAN, který na všechny počítače nainstaluje klientskou část programu a nechá si na server poslat po stisku tlačítka snímky jednotlivých pracovních ploch klientů. Ano, je to tak, dnes budeme tak trochu "šmírovat" cizí počítače.

Program pochopitelně opět využívá protokol TCP/IP, takže může fungovat samozřejmě nejen v síti LAN, ale i v rámci internetu. Zde však může být problém s přenášenými daty. I když před odesláním obrázku pracovní plochy jej převedeme do formátu JPEG, přesto jeho velikost není natolik malá, aby např. nezatěžovala modemové připojení. Můžete ovšem nastavit větší kompresi, snímky posílat jen jednou za čas a podobně.

Přistupme tedy k našemu programu. Už jsme si řekli, že použijeme komponenty z balíku Indy, který je součástí Delphi novějších verzí a případně si jej můžete zdarma stáhnout a nainstalovat z této adresy. I tentokrát tedy budeme mít dvě aplikace, server a klient, které budou na rozdíl od minulého dílu odpovídat této architektuře nejen použitými komponentami, ale i logikou provázanosti, kdy serverová část aplikace bude hlavním řídícím centrem pro klienty.

Už minule jsme narazili na problém, že server nemůže posílat klientům požadavky aniž by je o to klient požádal. Jak tedy docílíme toho, aby po stisknutí tlačítka na serverové části aplikace nám připojení klienti poslali svůj obrázek? Použijeme k tomu drobnou fintu. Serverová část aplikace si bude držet v paměti seznam připojených klientů a pro každého klienta bude mít vyhrazenu jednu pomocnou logickou proměnnou. Budeme-li požadovat od klienta obrázek stisknutím tlačítka, tato proměnná se nastaví na hodnotu true. Klienti pak budou sami v pravidelných intervalech kontaktovat server a ptát se ho, zda mu nemají poslat svůj snímek (jinými slovy, ptají se na hodnotu zmiňované pomocné proměnné). Je-li tomu tak, snímek pošlou a server pak pomocnou proměnnou opět nastaví na false a čeká na další stisknutí tlačítka.

Formulář serverové části tedy vlastně obsahuje jen komponenty Image, pro zobrazení došlého obrázku, dále tlačítko pro vyžádání jeho poslání a ListBox se seznamem připojených klientů. Označením příslušného klienta v seznamu a stisknutím tlačítka se nám zobrazí snímek jeho pracovní plochy.

Klientský formulář pak z vizuálních komponent neobsahuje vlastně nic, ale aby nebyla plocha úplně prázdná, umístíme na ní Label, který bude zobrazovat stav připojení.

Nejdůležitější jsou pochopitelně samotné komunikační komponenty z balíku Indy. Na serverové straně je to IdTCPServer ze záložky Indy Servers, u které musíme nastavit IP adresu a číslo portu v položce Bindings (opět nastavíme localhost a číslo portu třeba 222). Dále na formulář umístíme komponentu IdThreadMgrDefault, která spravuje jednotlivá vlákna spojení (počítáme s více klienty) a přes stejnojmennou vlastnost komponenty IdTCPServer je navzájem propojíme. Poslední komponenta bude IdAntiFreeze, která zamezí "zamrznutí" uživatelského prostředí opakovaným posíláním Application.ProcessMessages. Na klientské straně budeme potřebovat IdTCPClient (nastavený na adresu a port serveru) a opět IdAntiFreeze. Kromě toho použijeme i Timer pro pravidelné kontaktování serveru.

Tím bylo vlastně řečeno vše hlavní. Detaily naleznete v přiloženém zdrojovým kódu obou částí aplikace. Za zmínku stojí ještě funkce pro získání snímku obrazovky a následné převedení do formátu JPEG, ale obě funkce jsme již v seriálu kdysi používali a tak není třeba žádný další komentář.

Oba ukázkové projekty si můžete opět stáhnout. A ještě upozornění po některých reakcích na minulý díl. Nesmíte zapomenout povolit klientský program při průchodu firewallem, pokud nějaký používáte, jinak vám program samozřejmě nemůže nikdy fungovat.

Diskuze (7) Další článek: Microsoft se rozroste o čtvrtinu

Témata článku: , , , , , , , , , , , , , , , ,