Lekce 1 - Síť v Javě - Úvod
Vítejte v dalším Java tutoriálu, tentokrát zaměřeným na způsoby práce se sítí. V úvodní lekci si vysvětlíme, co to síťová komunikace je, jaké máme k dispozici techniky a seznámíme se se základní terminologií.
Síťová komunikace v Javě
Pod pojmem síťová komunikace si lze představit koncept propojení dvou nebo více počítačových zařízení, aby bylo možné mezi nimi sdílet informace a data. Přičemž tato zařízení nemusí být pouze stolní počítače, notebooky, smartphony či tablety, ale mohou to být i audio/vizuální systémy, kamery, ledničky, senzory atd.
Síťovou komunikaci v Javě označujeme též termínem síťové programování, což se spojuje s psaním programů, které lze spouštět napříč různými zařízeními propojených dohromady pomocí sítě za účelem sdílení zdrojů. Veškerá komunikace Java programu přes síť probíhá na aplikační vrstvě. Java API obsahuje různé třídy a rozhraní, jež provádějí nízko-úrovňové komunikační funkce a umožňují nám formulovat programy, které se zaměřují na řešení problému.
Techniky síťového programování
Uveďme si nyní dvě základní techniky:
- Programování zásuvek (socketů) – Tato metoda využívá tzv. sockety (česky zásuvky, někdy též sokety) a protokol TCP (viz níže) ke komunikaci mezi dvěma počítači přes společnou síť. Když je aplikace sdílená přes síť tak se klient pokusí vytvořit socket na jejím konci a připojit ji k serveru. Po navázání připojení server vytvoří objekt socketu. Nyní se tento objekt stává primárním způsobem komunikace mezi klientem a serverem.
- URL (Uniform Resource Locator) – URL odkaz či adresa je
ukazatel na konkrétní zdroj v síti. Java kód komunikující po síti může
používat třídu
java.net.URL
k reprezentaci adres zdrojů. Mechanismus získávání obsahu z jednotlivých typů URL je uživatelsky modifikovatelný, lze doprogramovat ovladače pro přístup k libovolné službě a pro zpracování libovolného typu obsahu.
Aplikační vrstva
Když píšete Java programy, které komunikují po síti, programujete na aplikační vrstvě:
Aplikační vrstva je nejvyšší vrstva síťové architektury internetu, její protokoly definují a specifikují pravidla komunikace a formáty datových struktur pro jednotlivé síťové služby.
Toto čtyřvrstvé rozdělení je založeno na referenčním modelu TCP/IP. Existuje také dělení síťové architektury podle modelu OSI, který obsahuje sedm vrstev.
Aplikační protokoly používají vždy jednu ze dvou základních služeb transportní vrstvy: TCP nebo UDP. Pro rozlišení aplikačních protokolů se používají tzv. porty, což jsou domluvená číselná označení aplikací. Každé síťové spojení aplikace je jednoznačně určeno číslem portu a transportním protokolem (a samozřejmě IP adresou).
Dělení síťové komunikace
V Javě se obvykle nemusíme starat o vrstvy TCP a UDP. Systémově
nezávislou síťovou komunikaci nám tu totiž poskytují třídy z
java.net
balíčku. Chceme-li se však rozhodnout, které třídy
by měly naše programy používat, musíme pochopit, jak se liší TCP a
UDP:
- TCP (Transmission Control Protocol) je protokol založený na spojení, který zajišťuje spolehlivý tok dat mezi dvěma počítači. Použije se u aplikací, které vyžadují spolehlivý komunikační kanál. Data musí být přijatá v pořadí v jakém byla odeslána. TCP tedy poskytuje point-to-point kanál pro aplikace, které vyžadují spolehlivou komunikaci. Hypertext Transfer Protocol (HTTP), File Transfer Protocol (FTP) a Telnet jsou příklady aplikací, které vyžadují spolehlivý komunikační kanál.
- UDP (User Datagram Protocol) je protokol, který odesílá nezávislé datové pakety, nazývané datagramy, z jednoho počítače do druhého bez jakýchkoliv záruk na jejich příchod. UDP není založen na připojení jako TCP.
Rozdíly v použití TCP a UDP protokolu
U mnoha aplikací je záruka spolehlivosti rozhodující pro úspěch. U jiných forem komunikace může spolehlivé spojení službu plně zneplatnit. Například server s hodinami, který na požádání odesílá aktuální čas svému klientovi - Pokud klient zmešká packet, nemá opravdu smysl jej znovu posílat, protože čas nebude správný, když jej klient obdrží až na druhý pokus. Spolehlivost TCP je v tomto případě zbytečná, protože způsobuje snížení výkonu a může bránit užitečnosti služby.
Dalším příkladem služby, která nepotřebuje záruku spolehlivého
kanálu, je příkaz ping
. Účelem příkazu ping
je
otestovat komunikaci mezi dvěma programy po síti. Ve skutečnosti potřebuje
ping
vědět o zahozených packetech nebo těch mimo pořadí, aby
mohl určit, jak dobré nebo špatné je připojení. Spolehlivý kanál by tuto
službu opět zcela zneplatnil.
Síťovou komunikaci můžeme tedy rozdělit na:
- Datagramovou komunikaci prostřednictvím protokolu UDP - Ta je nespolehlivá a nezaručuje, že se přenášený packet neztratí nebo že se nezmění pořadí packetů, případně může doručit některý packet vícekrát. Je vhodná pro služby, kde je důležitější rychlost než spolehlivost (přenosy zvuku a obrazu v reálném čase), ale např. taky služby DNS a DHCP.
- Spojovaná komunikace prostřednictvím protokolu TCP - Je spolehlivá, její implementace je v Javě jednodušší, než implementace packetové komunikace. Pracuje se totiž se streamy – tedy stejně, jako při práci se soubory.
Mnoho firewallů a směrovačů bylo nakonfigurováno tak, aby neumožňovaly packety UDP. Pokud máte potíže s připojením ke službě mimo vaši bránu firewall nebo pokud mají klienti potíže s připojením k vaší službě, zeptejte se správce systému, zda je povolen protokol UDP.
Terminologie síťové komunikace
Pojďme si na závěr shrnout a definovat použité termíny. Kromě již zmíněných TCP a UDP protokolů to jsou:
- IP adresa – Pomáhá identifikovat konkrétní zdroj v síti pomocí číselné reprezentace - jde o jedinečné číslo přiděleného uzlu sítě. Většina sítí kombinuje IP s TCP.
- Číslo portu – Používá se k jednoznačné identifikaci různých aplikací. Jde o komunikační koncový bod mezi aplikacemi. Protokoly TCP a UDP používají porty k mapování příchozích dat na konkrétní proces běžící na počítači.
- Protokol – Je sada pravidel, dodržovaných při komunikaci (např. TCP, FTP, POP atd.)
- MAC adresa – Další jedinečné číslo, které se používá ke sledování zařízení v síti.
- Socket – Již zmíněný socket je koncový bod obousměrného komunikačního spojení mezi dvěma aplikacemi běžícími v síti. Mohli bychom říci, že socket = číslo portu + IP adresa. Je to tedy jasně vymezený komunikační bod sítě (adresa počítače + port příslušné aplikace).
V příští lekci, Síť v Javě - Balíky pro síťovou komunikaci, si ukážeme základní balíky Javy pro síťovou komunikaci a jejich základní třídy včetně metod.