Umíme to s Delphi: 128. díl – vše o socketech

Pokud jste četli předchozí díl seriálu, víte, co znamená zkratka IP, co se skrývá pod TCP a jak funguje síťová komunikace prostřednictvím TCP/IP. Hlavní náplní našeho seriálu jsou však v současnosti sockety – a právě těmi se budeme dnes zabývat. Víte, co je vlastně socket? Víte, že spojení může být blokované a neblokované? Víte, jak přesně si se sockety poradit v Delphi?

Minulá část tohoto seriálu se zabývala základními údaji, které se týkají síťového provozu a protokolů IP a TCP. Řekli jsme si několik podstatných informací:

  • protokol IP (Internet Protocol) zajišťuje přenos tzv. IP datagramů. Datagram je malá část dat opatřená vlastním záhlavím. Přenos datagramů pomocí protokolu IP je zajišťován mezi dvěma koncovými uzly v Internetu.
  • počítače v Internetu jsou adresovány IP adresami ve formátu 127.100.85.123
  • na adrese 127.0.0.1 běží tzv. lokální softwarová smyčka
  • protokol TCP zajišťuje tzv. spojované služby, což znamená, že se stará o navázání spojení
  • k adresování TCP spojení se nepoužívá jen adresa počítače, ale také název portu.

Dnes volně navážeme na předchozí článek. Po jeho přečtení byste sice měli rozumět základním principům provozu na počítačových sítích a základním pojmům síťové komunikace, prozatím však není úplně jasná souvislost těchto informací se sockety, kterými se v posledních dílech zabýváme.

Co s tím mají společného sockety?

Protokoly IP a TCP jsou jistě zajímavé, adresy IP jsou bezpochyby účinné a jmenný systém DNS je propracovaný, nicméně otázkou zůstává, jak lze všechny tyto technologie použít při práci se sockety. Přesněji řečeno – jak sockety se všemi uvedenými pojmy souvisí? Vše bude zřejmé po přečtení následující věty:

Socket interface nebo zkráceně jen sockets je rozhraní, které zpřístupňuje služby protokolů TCP/IP jednotlivým aplikacím.

Jinak řečeno: pokud chceme ve své aplikaci použít protokolu IP, resp. protokolu TCP, nemusíme znát žádné podrobnosti o těchto protokolech, nemusíme vědět, jak se navazuje TCP spojení, jak probíhá potvrzování přijatých paketů, nemusíme znát princip posuvného okénka (sliding window): stačí použít rozhraní sockets a všechny důležité služby protokolů TCP/IP máme rovnou k dispozici.

Od toho okamžiku je můžeme používat ve své aplikaci, aniž bychom o nich ve své podstatě museli cokoliv důležitého vědět. Sockety si tedy můžete představit třeba jako jednotku Printers v Delphi: stačí ji použít v aplikaci a ihned můžeme používat systémovou tiskárnu; bez toho, abychom museli vědět jakékoliv podrobnosti o mechanismu tisku pod systémem Windows.

Při používání socketů tedy pracujeme s protokolem TCP/IP. Když jsme si v posledním článku tento protokol (TCP/IP budeme nadále označovat jako jeden protokol) popisovali, uvedli jsme si, že všemožné síťové protokoly se člení do různých úrovní, přičemž IP je protokol nižší úrovně než protokol TCP (protokol pro svou práci vlastně „využívá“ protokolu IP). Podívejme se však od protokolu TCP opačným směrem: nad ním existují další protokoly (vyšší úrovně), které poskytují zase sofistikovanější služby a které pro svou práci pro změnu využívají zase protokol TCP.

Příkladem takových protokolů je např. HTTP, FTP, SMTP, POP3, apod. Tedy: když používáme při prohlížení internetových stránek protokol HTTP, nebo při odesílání pošty protokol SMTP, komunikujeme v podstatě pomocí protokolu TCP.

Na tomto místě stojí za to zdůraznit také skutečnost, že protokol TCP je z tohoto pohledu pro používání síťových služeb zcela klíčový: pokud bychom neměli v systému instalovanou podporu protokolu TCP, nemohli bychom používat žádnou z běžných (avšak důležitých) služeb, tedy nemohli bychom prohlížet webové stránky, nemohli bychom odesílat ani číst poštu, nemohli bychom stahovat soubory přes FTP apod. (je samozřejmé, že předchozí větu nelze brát zcela doslova, ale v principu je situace právě taková).

Nikoho tedy ani nepřekvapí, že pokud se rozhodneme používat sockety v aplikacích psaných v Delphi, bude komunikace probíhat opět přes protokol TCP/IP. Jak jsme si již řekli (a jak jakožto pilní programátoři v Delphi už stejně tušíme), díky socketům a jejich přímočaré podpoře v Delphi nepotřebujeme o tomto protokolu mnoho vědět. Snad kromě základních informací, které byly uváděny v několika předchozích článcích.

Blokující a neblokující spojení

V souvislosti s používáním socketů je však důležitý ještě jeden pojem: blokující (resp. neblokující) spojení. Při programování socketů si totiž můžeme zvolit druh spojení; máme na výběr blokující a neblokující spojení.

Zamysleme se nad podstatou socketů. Řekli jsme si, že sockety jsou vlastně rozhraním k protokolu TCP/IP. Protože při práci s TCP/IP nám jde vždycky o posílání nějakých dat po počítačové síti, hovoříme při práci se sockety také vždycky hovoříme o datech. Respektive o jejich „zápisu do socketu“ (v případě, že potřebujeme data poslat), nebo o jejich „čtení ze socketu“ (v případě, že data naopak přijímáme).

Pokud čtení či zápis dat ze/do socketu probíhá asynchronně, tedy pokud odesilatel a příjemce dat nejsou nikterak synchronizováni – domluveni, jedná se o neblokující spojení. Lze jej přirovnat ke komunikaci formou SMS zpráv: aplikace (uživatel mobilního telefonu) pošle data (SMS zprávu) přes socket (mobilní telefon) a dál pokračuje ve svém běhu (jde se sprchovat) bez ohledu na to, jak dopadlo doručení dat (SMS zprávy). Jinak řečeno – aplikace po odeslání zprávy ihned běží dále a nečeká na dokončení čtení (odesílání) dat. Není tedy blokována.

Druhá možnost je blokující spojení, které znamená pravý opak: aplikace je po odeslání zprávy blokována až do okamžiku, kdy je operace dokončena. Tento způsob spojení si lze představit jako telefonát:jedna aplikace (volající telefonista) je zablokovaná (čeká na lince), dokud se druhá aplikace (volaný telefonista) neozve (nepřijme hovor).

Jsem si vědom skutečnosti, že uvedené příklady nejsou úplně přesné, ale žádné o mnoho lepší mě teď bohužel nenapadají, což mě moc mrzí a prosím všechny čtenáře s větší fantazií, aby využili diskusního fóra pod článkem :-)

Poslední otázka, která by nás mohla napadnout, spočívá v tom, jak zvolit druh spojení při práci v Delphi. Jak si uvedeme za okamžik, v Delphi volíme druh spojení prostřednictvím vlastností příslušných komponent.

Sockety v Delphi

Konečně se dostáváme k tomu, jak vlastně používat sockety v Delphi. V tomto díle si učiníme krátké shrnutí, v následujících dílech pak budeme jednotlivé komponenty rozebírat podrobněji.

V Delphi je (v závislosti na používané verzi) několik komponent pro práci se sockety. Jejich použití umožňuje jednoduše vytvořit aplikaci, která dokáže komunikovat s jinými aplikacemi pomocí protokolu TCP/IP. Použití komponent znamená možnost provádět čtení a zápis bez nutnosti zabývat se detaily na transportní úrovni. Jak už to tak v Delphi chodí.

Pomocí níže uvedených komponent lze programovat serverové i klientské aplikace. Serverové sockety poskytnou aplikaci funkčnost serveru: aplikace bude poskytovat nějakou službu a bude umožňovat připojení klientům, kteří tuto službu budou využívat. Klientské sockety naopak umožní aplikaci použít službu prostřednictvím připojení k jejímu poskytovateli (serveru). Tento princip jsme si již vyzkoušeli v našich jednoduchých ukázkových aplikacích – v klientské aplikaci v 126. dílu a v serverové v 125. části.

Již od Delphi verze 3 edice Client/Server jsou k dispozici komponenty ClientSocket a ServerSocket na záložce Internet. Tato záložka už v době Delphi 3 obsahovala 14 komponent pro komunikaci v Internetu.

Od vyšších verzí Delphi postupně nalézáme různé další palety komponent, které slouží pro komunikaci v Internetu pomocí různých protokolů - např. záložky FastNet nebo Indy (Internet Direct od komunity OpenSource). Od Delphi 6 se na záložce Internet objevují kromě původních ClientSocket a ServerSocket také komponenty TcpClient a TcpServer. V Delphi verze 7 jsou již komponenty ClientSocket a ServerSocket z palety odebrány. Ať se rozhodnete pro kteroukoliv ze skupin komponent, ve všech případech je práce s komponentami do určité míry podobná. Komponenty pro komunikaci v Internetu však budete marně hledat v nejlevnějších edicích Delphi Personal.

TcpClient a TcpServer: jak na ně

Podrobnější popis socketových komponent začneme komponentami, které jsme již vlastně poznali: TcpClient a TcpServer ze záložky Internet. Abych nebyl příliš kamenován v diskusi, ještě jednou zdůrazním, že majitelé Delphi 7 se také dočkají; popis „jejich“ socketových komponent bude následovat bezprostředně poté, co se vypořádáme s předchozími verzemi Delphi.

Jak tedy (v kostce) používat komponenty TcpServer a TcpClient? Poté, co naše aplikace naváže spojení se vzdálenou stranou (ať již serverovou nebo klientskou), můžeme informace o tomto spojení získávat právě z komponent TcpServer, resp. TcpClient umístěných v záložce Internet.

Pokud ve své aplikaci použijeme kteroukoliv z těchto komponent, dojde vlastně k jejímu asociování s objektem Windows socket, který reprezentuje koncový bod aktuálních socketového spojení. Jak asi žádného uživatele Delphi nepřekvapí, komponenty TcpServer a TcpClient jsou zapouzdřením Windows API volání týkajících se socketů, a to pro jednoduchou práci v Delphi.Aplikace se tedy nemusí nijak zabývat podrobnostmi navazování a udržování spojení.

Nic nám samozřejmě nebrání používat při programování aplikací přímo sockety systému Windows a pracovat tedy rovnou s odpovídajícími API funkcemi systému; může se to hodit zejména v situacích, kdy potřebujeme mít nad spojením a nad komunikací větší kontrolu. V takovém případě pracujeme přímo s vlastnostmi, událostmi a metodami Windows socket objektů.

Klientské aplikace v Delphi – přehled

Protože v nápovědě k Delphi je hezky zpracován přehled kroků, které je nutné učinit k implementaci klientské aplikace v Delphi, dovolím si tento přehled částečně přejmout. Podrobný popis jednotlivých komponent a vlastností si uvedeme v příštím dílu seriálu. Takže – co je nutné učinit, pokud chceme implementovat klientskou aplikaci v Delphi (stále se pohybujeme ve straších verzích, nikoliv v Delphi 7)?

Krok první – specifikování požadovaného serveru

Prvním nutným krokem, který musíme učinit, je specifikování požadovaného serveri. Klientské socketové komponenty disponují řadou vlastností, které nám umožňují specifikovat požadovaný server a jeho port, k němuž se hodláme připojit. Můžeme použít např. vlastnost Host, do níž lze nastavit jméno vzdáleného počítače. Pokud toto jméno neznáme, nebo pokud nám jde především o rychlé navázání spojení (kkteré nebude zdržováno vyhledáváním adresy počítače na základě jeho jména), můžeme specifikovat přímo IP adresu – v takovém případě nás bude zajímat především vlastnost Address.

Je nutné specifikovat alespoň jeden z údajů IP adresa – jméno. V případě, že uvedeme oba údaje, má přednost kupodivu jméno.

V případě serverových aplikací, další nutností je specifikování čísla portu, k němuž se budou klienti našeho serveru připojovat. Číslo portu můžeme zadat buď přímo (pomocí vlastnosti Port, jak jsme si ukazovali v našich příkladech), a nebo nepřímo prostřednictvím jména požadované služby – v takovém případě nám poslouží vlastnost Service. Opět platí, že v případě zadání obou údajů (čísla portu i jména služby) přednost bude mít slovní vyjádření, tedy jméno služby.

Krok druhý – navázání spojení

Jakmile jsme u klientské aplikace nastavili požadovaný server, k němuž se budeme chtít připojit, můžeme navázat TCP spojení. Přestože v čistém protokolu TCP není navázání spojení zrovna triviální záležitostí, za použití komponent TcpServer a TcpClient jde naopak o maličkost.

Za běhu aplikace je navázání spojení proveditelné zavoláním metody komponenty TcpClient.Open. Existuje však také možnost, jak zajistit, aby aplikace navázala spojení automaticky při svém spuštění – pak stačí nastavit (v době návrhu, v Object Inspectoru) hodnotu vlastnosti Active na True.

Na závěr

V dnešním článku jsme si vysvětlili, co vlastně jsou sockety, jaký je rozdíl mezi blokujícím a neblokujícím spojením, a jak pracovat se sockety ve vývojovém prostředí Delphi. V závěru článku jsme se začali zabývat kroky, které musíme vykonat při programování klientských aplikací v Delphi. Za týden budeme pokračovat dalšími činnostmi.

Diskuze (2) Další článek: Červ Sasser, varianta E - pozor, chová se jinak!

Témata článku: Software, Programování, Síťová IP, Díl, Adresa počítače, Krok druhý, DEL, Síťová komunikace, Jednotlivá adresa, Krátké shrnutí, Socket, Základní popis, Poslední věta, Poslední otázka, SoC, Síťový protokol, Jednotlivý díl, Spojení, Důležitý údaj, Síťová data, Nejlevnější mobilní telefony, Důležitý krok, Základní princip, Jednoduchý princip, Delphi


Určitě si přečtěte

Co všechno se spouští se startem Windows a proč by vás to mělo zajímat

Co všechno se spouští se startem Windows a proč by vás to mělo zajímat

** Společně s operačním systémem se spouští řada aplikací a služeb ** Mohou mít negativní dopad na celkovou dobu startu Windows ** Jak získat kontrolu nad automaticky spouštěnými programy?

Karel Kilián | 59

České Rajče je stále plné dětských nahotin. Student pomocí A.I. analyzoval miliony fotek

České Rajče je stále plné dětských nahotin. Student pomocí A.I. analyzoval miliony fotek

** Rajče.net má odjakživa problémy s choulostivými fotkami dětí ** Student zlínské univerzity analyzoval jeho katalog ** Neuronová síť doposud prozkoumala 6 milionů snímků

Jakub Čížek | 73

13 praktických tipů a triků pro Mapy.cz, které možná neznáte

13 praktických tipů a triků pro Mapy.cz, které možná neznáte

** Mapy.cz neslouží jen k zobrazení podkladů a plánování tras ** Nabízejí celou řadu dalších praktických funkcí a možností ** Vybrali jsme třináct tipů a triků, o kterých možná nevíte

Karel Kilián | 36



Aktuální číslo časopisu Computer

Test 9 bezdrátových reproduktorů

Jak ovládnout Instagram

Test levných 27" herních monitorů

Jak se zbavit nepotřebných věcí na internetu