Umíme to s Delphi: 124. díl – programování síťových aplikací: sockety poprvé

Dnešní díl je úvodem do série článků zabývajících se síťovou komunikací a využití tzv. socketů při programování síťových aplikací v Delphi. Vysvětlíme si, co budeme rozumět síťovými aplikacemi, pochopíme jejich princip, srovnáme několik komunikačních technologií a zodpovíme několik stěžejních otázek.

V předcházející části tohoto seriálu jsem slíbil, že se konečně pokusíme uzavřít téma „nastavení překladače“ a posuneme se dále, k některé pokročilejší oblasti. Dobrá zpráva je, že se v minulém dílu opravdu podařilo dokončit tématický okruh týkající se překladače Delphi a můžeme se tedy směle vrhnout do slíbené změny.

Pod touto změnou se ukrývá téma, které vám odhalil už nadpis článku. Hlavním klíčovým slovem, kterým můžeme charakterizovat nejen dnešní, ale i několik následujících článků, je výraz socket. Budeme se totiž vytvářet aplikace, které prostřednictvím socketů dokáží navzájem komunikovat, a to typicky pomocí protokolu TCP/IP, tedy pomocí asi nejklasičtějšího protokolu známého např. z prostředí internetu.

Pokud jste nyní zděšeni a máte obavy, že článkům neporozumíte, neházejte prosím pověstnou flintu do žita. Přestože jste se dosud se síťovými technologiemi, s přenosovými protokoly ani se sockety nesetkali, věřím, že v sérii článků (naplněné praktickými ukázkami) dokážeme společně učinit onen první krok, který je k pochopení socketů a jejich způsobu práce nejdůležitější.

Neočekávejte však prosím, že už v dnešním článku se naučíte vytvořit aplikaci, která dokáže komunikovat s kteroukoliv jinou aplikací na vašem vlastním, nebo na úplně jiném síťovém počítači. Jak už to tak v Delphi chodí, používání socketů v tomto vývojovém nástroji není v zásadě obtížné. Přesto však považuji za užitečné objasnit některé důležité teoretické aspekty síťové komunikace, která se socketových aplikací úzce dotýká.

Na druhou stranu bych se však nerad pouštěl do podrobného popisu celé problematiky počítačových sítí. Jednak k tomu necítím dostatečnou erudici a jednak se jedná o natolik rozsáhlé téma, že by si zasloužilo samostatný seriál. V žádném případě nelze rozebrat veškeré podrobnosti o počítačových sítích ani o Internetu v rámci jednoho nebo dvou stručných článků; vzhledem k zaměření našeho seriálu to nakonec není ani účelné.

Abychom tento úvod nějak shrnuli, dovolím si zopakovat, že cílem několika následujících článků bude:

  • seznámit se základními principy síťové komunikace ty uživatele, kteří dosud nikdy nepřišli do kontaktu s počítačovými sítěmi a kteří třeba ani netuší, jak vlastně počítače po síti komunikují;
  • vysvětlit podrobněji princip meziprocesové komunikace založené na tzv. socketech;
  • ukázat všem programátorům, jakým způsobem lze v Delphi programovat aplikace komunikující pomocí socketů.

Naopak však není cílem následujících článků suplovat výukové materiály týkající se podrobností o počítačových sítích, o síťových vrstvách a o komunikačních protokolech.

Na samotný závěr úvodního odstavce (přes riziko, že pozornost ctěných čtenářů mohla v průběhu předchozích odstavců značně ochabnout :)) jsem si nechal možná nedůležitější upozornění, které bude profesionálům připadat směšné, avšak začátečníkům možná zrovna teď hlodá v podvědomí:

K tomu, abychom si společně mohli ukázat programování síťových aplikací komunikujících přes sockety, nebudete potřebovat žádnou počítačovou síť, vystačíte si jednoduše se svým počítačem, stojícím osamoceně v přítmí vašeho programátorského kutlochu. Důvod si vysvětlíme později, avšak celý zázrak je založen na tzv. lokální softwarové smyčce, díky níž je možné regulérně komunikovat přes síťový protokol TCP/IP i v rámci dvou aplikací běžících na jednom počítači.

Avšak dost bylo úvodních řečí, můžeme přejít k věci. Jak si spolu vlastně počítače povídají?

Jsi síťový nebo nejsi?

Nuže, v posledních letech jsme si již jaksi zvykli, že málokterý počítač si vystačí úplně sám se sebou a se svou CD mechanikou. Svět počítačů se začíná propojovat vlastně pojem „začíná se“ je již hrubě nepřesný). Počítače jsou obvykle spojeny do větších či menších celků zvaných počítačové sítě; velké (a stále rostoucí) procento počítačů je také připojeno do známé velké, největší, celosvětové počítačové sítě zvané Internet.

Ponechme stranou filozofické otázky související s dopady této globalizace, zapomeňme na všechny hrozby a neduhy plynoucí z propojení počítačů (šíření virů, bezpečnostní útoky, nelegální výměna softwaru chráněného autorskými právy, anonymní výměna nelegálních informací apod.) a spokojme se se závěrem, že propojení počítačů je věc veskrze pozitivní, která dokáže nesmírně zvýšit efektivitu fungování všech zainteresovaných.

Velikou výhodou síťových technologií (a především internetu jako takového) je transparentnost, tedy „ukrytí jakékoliv technické a geografické infrastruktury sítě před jejími uživateli“. Můžeme jít dokonce ještě dál: při mírném zjednodušení situace můžeme dokonce říci, že jakákoliv technická a geografická infrastruktura sítě je skryta i před programátory síťových aplikací.

Díky tomu, že stávající síťové technologie byly (v zásadě) dobře navrženy a díky tomu, že máme k dispozici sofistikované vývojové nástroje (jako například Delphi), nemusí v zásadě programátor síťové aplikace nic moc vědět o tom, jak počítačová síť vlastně funguje. A toho my právě využijeme :)

Co budeme rozumět síťovou aplikací

Než si začneme vypravovat o tom, co potřebujeme k tomu, abychom mohli slavnostně naprogramovat svou první síťovou aplikaci, prozradíme si, co vlastně budeme rozumět pod pojmem síťová aplikace.

Jsem si jist, že následující definice bude zhola nepřesná a že všichni ortodoxní „síťaři“ po jejím přečtení pocítí neodolatelnou touhu dostat mě do rukou, aby mě podrobili velmi intenzivnímu školení. Přesto si však dovolím stanovit, že síťovou aplikací budeme nadále rozumět takovou aplikaci, která si dokáže přímo vyměňovat data s jinou aplikací umístěnou kdesi (tedy v blíže neurčeném geografickém umístění) v počítačové síti.

Pokud patříte mezi programátorské dědečky, kteří sledují tento seriál pravidelně už od doby jeho vzniku, možná si vzpomínáte, že už jsme se v jeho rámci několikrát zabývali aplikacemi, které také dokáží komunikovat se svým okolím a s jinými aplikacemi. Jednalo se o popis technologií, které jsou ze své podstaty založeny na nějaké formě komunikace. Následující přehled popisuje technologie jako takové, nikoliv jejich podstatu (tedy neříkáme, na čem jsou založeny, ale jak je z hlediska implementace využíváme):

  • technologie OLE (Object Linking and Embedding) – díly 38 až 40
  • technologie DDE (Dynamic Data Exchange) – díly 60 až 63
  • technologie zpráv systému Windows – díly 64 až 66

Abychom neponechali žádný prostor pro pochybnosti a nejasnosti, pokusím se vysvětlit, proč jsme v souvislosti s těmito technologiemi nehovořili ani o počítačových sítích, ani o síťových protokolech, ani explicitně o síťových aplikacích:

  • technologie OLE sice dokáže přinutit jinou aplikaci, aby dělala to, co potřebujeme, nicméně o síťové komunikaci nelze příliš hovořit, protože prostřednictvím technologie OLE jsme v zásadě jen spouštěli jiné aplikace instalované v systému a žádali jsme je o provedení požadovaných služeb (například zobrazení dokumentu ve formátu Word apod.);
  • technologie DDE se sice více podobá jakési síťové komunikaci, neboť jedna aplikace si může vyměňovat data s druhou (spuštěnou) aplikací, nicméně komunikace probíhá prostřednictvím sdílené paměti a celý princip DDE je již velmi zastaralý a v současnosti se příliš nepoužívá. Kromě toho myslím (ač si tím nejsem zcela jist), že DDE lze také použít jen v rámci jednoho počítače, takže o síťové komunikaci vlastně nelze hovořit.
  • zasílání zpráv uvnitř systému Windows také patří mezi formy meziprocesové komunikace, avšak také nijak nesouvisí se sítěmi – zprávy zasíláme v rámci jednoho systému.

Existuje samozřejmě řada dalších forem komunikace mezi aplikacemi, přičemž některé z nich boří bariéry lokálního počítače a umožňují i vzdálenou komunikaci, nicméně těmi jsme se v našem seriálu dosud nezabývali, proto je nebudeme na tomto místě vysvětlovat (jedná se např. o vzdálené volání procedur – Remote Procedure Call, RPC, jako součást komunikace mezi softwarovými komponentami v modelu DCOM apod.).

Z uvedených informací tedy plyne, že sockety jsou prvním ryze síťovým konceptem, kterým se v našem seriálu zabýváme.

Co potřebujeme pro psaní síťových aplikací

Pojďme si však konečně vysvětlit, jakým způsobem spolu komunikují dvě aplikace, z nichž každá běží na úplně jiném počítači. Dejme tomu, že aplikace A běží na počítači 1, který je umístěn v České republice. Aplikace B pak běží na počítači 2 umístěném na Slovensku.

Ne že by to někoho překvapilo, ale nutnou podmínkou pro to, aby aplikace A a B spolu dokázaly komunikovat prostřednictvím počítačové sítě, je propojení počítačů 1 a 2 do počítačové sítě. Dejme tomu, že počítače 1 a 2 tuto podmínku splňují.

Další podmínkou pro fungující komunikaci mezi A a B spočívá v tom, aby počítačová síť, do níž jsou zapojeny počítače 1 a 2, byla „rozumná“ a „funkční“.

Pojem „rozumná“ v tomto místě znamená splnění zhruba následujícího požadavku: „uvnitř počítačové sítě existuje jasně definovaná sada pravidel (které říkáme protokol), která popisují komunikaci v rámci této sítě“. Jinak řečeno: požadujeme, aby počítačová síť jasně říkala, jakým způsobem spolu připojené počítače komunikují, jak navazují spojení, jak je ošetřena možná ztráta dat při přenosu, jak se počítače střídají „v řeči“ apod. Pokud si jako příklad vezmeme celosvětovou síť Internet, je samozřejmě tento požadavek splněn: Internet je postaven na jasně definovaných protokolech TCP/IP (podrobně viz dále); za léta svého provozu asi všechny přesvědčil, že tato pravidla očividně fungují. Internet je tedy „rozumný“.

Pojem „funkční“ pak označuje především funkční „fyzickou“ infrastrukturu sítě, tedy existenci a správné zapojení propojovacích kabelů, síťových karet a všech dalších potřebných propriet. Můžeme si opět vypomoci naším příkladem s celosvětovou sítí Internet: pokud je váš počítač připojen k Internetu, znamená to, že fyzická infrastruktura vašeho připojení funguje: máte správně natažené kabely, správně zapojenou síťovou kartu (modem), správně nakonfigurované připojení a všechny další náležitosti. Máte tedy Internet funkční.

Ač se to může zdát neuvěřitelné, splnění těchto dvou podmínek stačí pro to, abyste se mohli vrhnout do vytváření plnohodnotných síťových aplikací. Jinak řečeno: máte-li funkční připojení k Internetu, máte vše potřebné pro to, abyste mohli využívat přímou komunikaci mezi aplikacemi na počítačích umístěných v Internetu.

Je samozřejmé, že Internet není jedinou použitelnou sítí, v jejímž rámci můžete komunikovat, a stejně tak TCP/IP nejsou jediné protokoly, které lze použít pro komunikaci. Důležitá je zkrátka existence protokolu a funkční síť.

Jak si ukážeme později (a jak jsme už naznačili), pro programování „síťových“ aplikací v zásadě nepotřebujete ani připojení k Internetu (nebo jiné síti). V tomto případě jsou však na místě uvozovky u slova „síťových“: můžete totiž vytvořit aplikaci A, která se bude tvářit jako síťová a která bude komunikovat s aplikací B; pak můžete vytvořit aplikaci B, která se bude tvářit jako síťová a která bude komunikovat s aplikací A. Nakonec však umístíte aplikace A i B na jeden počítač.

V tom případě nemusíte mít počítač vůbec připojený k žádné síti. Aplikace A a B spolu přesto komunikují stejně, jako by se jednalo o plnohodnotnou síťovou aplikaci. Stačí nám tedy jeden počítač a nepotřebujeme žádnou síť. Stále však potřebujeme protokol; jeho přítomnosti se nevyhneme: počítač nám stačí jeden, ale jeho součástí musí být instalovaný síťový protokol (ten však bývá součástí operačního systému, takže potíže v tomto případě typicky nehrozí).

Všechny informace, které jsme si až dosud uvedli, vlastně nejsou nijak překvapivé a implicitně je jistě všichni tušíme. Přesto bych však byl rád, kdybychom všichni měli stejné startovní podmínky a abychom si všichni pod sítěmi a síťovými aplikacemi představovali totéž.

Co je nejdůležitější?

Z předcházejících odstavců si můžete odnést náhled na princip síťových aplikací a nebo také skoro nic; rád bych však zdůraznil přinejmenším jeden důležitý závěr.

O několik řádků výše je uvedeno, že k programování síťových aplikací vám stačí rozumná a fungující počítačová síť. Nic míň, ale také nic víc.

Tento závěr zdánlivě není nijak převratný, avšak rád bych poukázal především na to, že splnění těchto dvou podmínek skutečně stačí. Jinak řečeno: nepotřebujete ani žádné hluboké a podrobné znalosti počítačových sítí a principu jejich fungování. V případě Delphi (jak si ukážeme už příště) si vystačíme s několika základními informacemi o protokolu TCP/IP (ale uvidíte sami, že těchto informací bude naprosté minimum a budou se týkat spíše „používání“ protokolu než jeho „technologického zázemí“) a se znalostí několika komponent Delphi. Naprogramování síťové aplikace bude pak v zásadě hračkou.

Počítačové sítě jsou navrženy tak, že je může ve svých aplikacích používat skoro úplně každý, i když jim vůbec nerozumí.

Na závěr

Možná jsme zklamáni obsahem dnešního článku. Pokud jste čekali podrobný popis socketů a jejich použití v Delphi, asi jste teď trochu rozladěni. Přesto si však myslím, že uvedené informace jsou pro úplné začátečníky se síťovými aplikacemi velmi důležité, protože jim umožní nahlédnout na celou oblast komunikace z patřičného nadhledu.

V příštím článku se již budeme věnovat praktickým dovednostem: sockety konečně odhalí svou tajuplnou tvář.

Diskuze (1) Další článek: Klamavé odkazy v Internet Exploreru

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