|
||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
Java (18) - síťová komunikace I.Jestliže jsem minule zdůrazňoval důležitost práce se soubory, nyní přijde na řadu možná ještě důležitější téma - výměna dat po síti. Podpora TCP/IP (včetně IPv6) je v Javě na výborné úrovni.
Doba síťováDnešní dobu lze bez nadsázky označit za období síťové komunikace. Význam dálkového přenosu dat stále vzrůstá, proto je i v Javě věnována této oblasti mimořádná pozornost. Je to důležité hlavně proto, že právě sítě jsou častým místem pro nasazení Javy, ať pro stranu serverovou nebou klientskou. Z tohoto důvodu jsem se rozhodl věnovat se této oblasti už nyní, v souvislosti se vstupně/výstupními operacemi. Začneme samozřejmě úplnými základy, tedy tím, jaká je vůbec filosofie síťové komunikace v Javě, jak se navazuje spojení, jak jsou reprezentovány adresy apod. "Vyšší stupeň" síťové komunikace (tedy podporu vzdáleného zpracování dat, přístup do databází, distribuované zpracování dat atd.) si necháme na později. Základy síťové komunikacePro další výklad budu předpokládat, že čtenáři znají základy technologie TCP/IP verze 4, tedy zejména způsob reprezentace adres, základní vlastnosti jednotlivých komunikačních protokolů, mechanismus navazování a ukončování spojení atd., bude se to totiž zatraceně hodit. Protože IP verze 6 je poměrně nová záležitost, a zatím se moc nepoužívá, budu při popisu používat (tam, kde na tom záleží) vždy verzi 4 a o odlišnostech verze 6 se zmíním (většina API však verzi vůbec nerozlišuje). Nyní ještě raději velice stručně obecný úvod do TCP/IP: Datagramová komunikaceZačneme tím jednodušším, datagramovou komunikací (reprezentovanou zde protokolem UDP). Kdo tuto komunikaci zná, tak ví, že vytvoříme balík dat (paket, datagram) a ten odešleme na nějaký (jiný, ale klidně i tentýž) počítač. Zde ho může (ale také nemusí) někdo očekávat - pokud ho nějaký program očekává, naslouchá na tzv. portu, a když mu data přijdou, zpracuje je. Komunikace probíhá prostřednictví naprosto nezávislých datagramů, které odesílatel posílá v dobré víře, že je někdo přijme a zpracuje. Není nijak zajištěno, že datagram dojde v pořádku (resp. že vůbec dojde), ani že datagramy přijdou v pořadí, v jakém se odesílaly. Pokud je to nutné, musí si tyto mechanismy zajistit příslušné aplikace. V praxi se datagramová komunikace používá např. pro službu doménových jmen (DNS), některé způsoby multimediálních přenosů nebo třeba pro vzdálené volání procedur (RPC). Spojová komunikaceVyšším stupněm je spojová komunikace, zde protokolem TCP. Mezi počítači (přesněji řečeno porty na počítačích) se vytvoří komunikační kanál, který je zabezpečený z hlediska poškození nebo ztráty dat, a zaručuje správné pořadí přenášených dat. Data se sice posílají v paketech, ale to je aplikačním programům prakticky skryto. Před použitím je nutno komunikační kanál vytvořit, co předpokládá, aby jeden z komunikujících programů naslouchal na příslušném portu a druhý se na tento port připojil. Spojovou komunikaci používá většina aplikací, jmenovitě třeba HTTP, FTP, poštovní protokoly (SMTP, POP3, IMAP4), telnet a SSH apod. Adresy a porty v JavěNež začneme komunikovat, musíme nejdřív vědět s kým. Proto je důležité vědět, jak se v Javě pracuje s adresami a porty. Není to nic těžkého, dokonce se dá říct, že oproti jiným jazykům (třeba C/C++) máme hodně práce usnadněno. Reprezentace IP adres
Většina základních síťových záležitostí se nachází v balíku Všechny uvedené třídy se vyznačují tím, že nemají žádný veřejný konstruktor. Instance se vytvářejí statickými metodami a lze přitom použít některou z následujících cest:
Vytvořená instance je neměnná. Adresa obecně nemusí znamenat pouze jediný cíl (unicast), ale může být i typu multicast. Zvláštním případem je tzv. nespecifikovaná (též anylocal) adresa, která se nesmí použít pro určení cíle, ale má význam při přidělování lokálních adres (říká, že lze použít libovolnou místní adresu, tedy i libovolné rozhraní).
Instance třídy
Jak se s objekty byte ip4[] = { 82, 208, 29, 37 }; // adresa IPv4 try { InetAddress ia = InetAddress.getByAddress(ip4); InetAddress ia2 = InetAddress.getByName("82.208.29.37"); InetAddress ia3 = InetAddress.getByName("www.linuxsoft.cz"); InetAddress ia4 = InetAddress.getByAddress("www.linuxsoft.cz", ip4); InetAddress local = InetAddress.getLocalHost(); // místní adresa System.out.println(ia.getCanonicalHostName()); if (!ia.isReachable(5000)) System.err.println("Stroj je nedostupny"); } catch (UnknownHostException e) { e.printStackTrace(); }
Je to snad dostatečně zřejmé. První čtyři volání statických metod budou mít
(pokud vše půjde, jak má) za následek vytvoření stejné instance (předpokládám,
že Čísla portů
Jak známo, čísla portů jsou šestnáctibitová, tedy v rozsahu 0-65535. V Javě
však používáme k jejich reprezentaci typ Úplná specifikace
Máme k dispozici i třídu, která sdružuje adresu a číslo portu do jediného
objektu. Je to třída
Zvláštním způsobem vytvoření je zavolání statické metody Následující příklad ukazuje různé cesty vytvoření objektů IP adresy s číslem portu: try { // vytvoření z instance přeložené IP adresy InetAddress ia = InetAddress.getByName("www.linuxsoft.cz"); InetSocketAddress isa = new InetSocketAddress(ia, 80); // dtto, ale nevyhazuje se výjimka při chybě DNS InetSocketAddress isa2 = new InetSocketAddress("www.linuxsoft.cz", 80); // nepřeložená adresa InetSocketAddress isa4 = InetSocketAddress.createUnresolved("www.linuxsoft.cz", 80); // nespecifikovaná adresa, automatický port InetSocketAddress isa3 = new InetSocketAddress(0); } catch (UnknownHostException e) { e.printStackTrace(); }
První cestou je vytvořit instanci Síťová rozhraní
Jak jsem se zmínil v odstavci o získání lokální adresy, uvedená metoda
neumožňuje určit, ke kterému síťovému rozhraní má daná adresa patřit
- v počítači může být těchto rozhraní (síťových karet, modemů apod.) větší
počet. Přesto ale nejsme zbaveni možnosti určit, se kterým rozhraním se bude
pracovat. Máme totiž třídu
Rozhraní můžeme určit buď podle jeho IP adresy, anebo podle názvu zařízení,
např.
Hlavním smyslem třídy try { // rozhraní identifikované názvem NetworkInterface ni = NetworkInterface.getByName("eth0"); // zpracování seznamu IP adres k rozhraní Enumeration<InetAddress> adr = ni.getInetAddresses(); while (adr.hasMoreElements()) { InetAddress ia = adr.nextElement(); ... } } catch (SocketException e) { e.printStackTrace(); } Z příkladu je jasně vidět, jak se získá přístup k rozhraní identifikovanému svým názvem, a jak se pak pracuje se seznamem IP adres, které má rozhraní přiřazeno. Většinou je tato adresa jediná, ale musíme počítat s tím, že jich může být víc, ale nemusí být také žádná (třeba při chybě v konfiguraci sítě). KomunikujemeToto bylo nutné minimum, bez kterého se nelze obejít při jakékoli síťové komunikaci. Zatím jsme ještě nekomunikovali, ale k tomu se dostaneme příště. Budeme posílat UDP datagramy a navazovat spojení protokolem TCP.
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |