3. diel - Sieť v Jave - Práca s URL
V minulej lekcii, Sieť v Jave - Balíky pre sieťovú komunikáciu , sme si ukázali základné balíky Javy pre sieťovú komunikáciu a popísali ich základné triedy vrátane metód.
V dnešnom Java tutoriále venovanom práci so sieťou sa budeme
podrobnejšie zaoberať balíčkom java.net
a špeciálne jeho
triede URL
. Ukážeme si praktické príklady práce s URL adresou
a popíšeme si hlavné metódy, ktoré java.net.URL
ponúka.
Práca s URL
Balíkjava.net
obsahuje triedu URL
. Táto trieda
reprezentuje adresu (Uniform Resource Locator) nejakého prostriedku vo
World Wide Web. Každá URL sa skladá zo štyroch častí, pričom iba
dve prvé sú povinné, ostatné sa dosadzujú implicitne:
- Identifikátor protokolu – ftp, http...
- Názov servera alebo IP adresa - napr.: https://www.itnetwork.cz/
- Číslo portu - číslo portu je už voliteľný atribút, štandardné číslo http servera je 80
- Názov súboru alebo názov adresára - opäť sa jedná o voliteľný
atribút, štandardne je uvedený
index.html
Vytvorenie URL
TriedaURL
poskytuje niekoľko možností vytvorenia URL.
Najjednoduchšia cesta, ako vytvoriť URL objektu, je použiť
String
reprezentujúci pre človeka zrozumiteľnú formu URL
adresy. V Java programe teda vytvoríme takýto objekt nasledovne:
URL zakladniAdresa = new URL("https://www.itnetwork.cz");
Práve sme vytvorili absolútnu adresu URL. Absolútna
adresa URL obsahuje všetky informácie potrebné na dosiahnutie daného
zdroja. URL objekty je možné vytvoriť aj za pomoci
relatívnej adresy s použitím URL konštruktora, ktorý
prijíma iný URL objekt (základ) a relatívnu špecifikáciu URL
(String
). Relatívna adresa je platná iba v kontexte
základnej adresy URL.
Pozrime sa na ďalší príklad:
URL url = new URL(zakladniAdresa, "java-networking-uvod");
Prvý argument určuje základ nového URL. Druhý argument určuje zvyšok
názvu zdroja vzhľadom na základ. Pokiaľ je základ null
,
zaobchádza konštruktor s relatívnou URL ako s absolútnou špecifikáciou URL
a základná URL sa ignoruje.
Uveďme si aj ďalšie možnosti, ako vytvoriť URL objekt:
URL(String protokol, String host, String soubor)
- Vytvorí objekt URL zo zadaného protokolu, hostiteľa a názvu súboru.URL(String protokol, String host, int port, String soubor)
- Vytvorí objekt URL z protokolu, hostiteľa, čísla portu a názvu súboru.URL(String protokol, String host, int port, String soubor, URLStreamHandler handler)
- Vytvorí objekt URL zo zadaného protokolu, hostiteľa, čísla portu, názvu súboru a obslužnej rutiny, ktorá je typuURLStreamHandler
.URL(URL zakladniAdresa, String relativniAdresa, URLStreamHandler handler)
- Vytvorí objekt URL analýzou danej špecifikácie so zadanou obslužnou rutinou v rámci základu.
Prvé dva spôsoby sa používajú vtedy, keď nemáme reťazec obsahujúci úplnú špecifikáciu adresy URL, ale iba časti tejto adresy.
Všetky tvary konštruktorov môžu pri chybnom zadaní niektorého parametra
vyvolať výnimku MalformedURLException
, preto je nutné vytvárať
objekty URL v try-catch bloku. Vložme teda kód do hlavnej metódy
main()
, obaľme ho blokom try-catch, doplňme potrebné balíčky,
pridajme metódy pre výpis a spustime:
import java.net.MalformedURLException; import java.net.URL; public class Main { public static void main(String[] args) { try { // vytvoření absolutní adresy URL URL zakladniAdresa = new URL("https://www.itnetwork.cz"); // vytvoření relativní adresy URL URL relativniAdresa = new URL(zakladniAdresa, "java-networking-uvod"); // tisk řetězcové reprezentace adresy URL System.out.println("Reprezentace adresy URL (absolutni): " + zakladniAdresa.toString()); System.out.println("Reprezentace adresy URL (relativní): " + relativniAdresa.toString()); } catch (MalformedURLException e) { System.out.println(e); } } }
Výsledkom bude vytvorenie objektu triedy URL
a tento výpis (s
funkčnými odkazmi):
Konzolová aplikácia
Reprezentace adresy URL (absolutni): https://www.itnetwork.cz
Reprezentace adresy URL (relativní): https://www.itnetwork.cz/java-networking-uvod
Vytvorením objektu triedy URL
sme vyrobili iba lokálny
objekt, pre nadviazanie spojenia musíme tento objekt spojiť s URL a
použiť metódu openConnection()
. Táto metóda vytvorí objekt
triedy URLConnection
, inicializuje ho a pripojí sa na toto URL po
sieti. Ak sa niektorá časť pripojenia nepodarí, metóda
openConnection()
vyvolá výnimku IOException
.
Dôležité metódy triedy
URL
Poďme si predstaviť a krátko popísať základné metódy, ktoré trieda
URL
pre prácu na sieti ponúka:
Hlavné metódy | Popis |
---|---|
public String getProtocol() | Vráti protokol adresy URL. |
public String getHost() | Vráti názov hostiteľa adresy URL. |
public int getPort() | Vráti číslo portu adresy URL. |
public String getFile() | Vráti názov súboru adresy URL. |
public String getAuthority() | Vráti autoritu adresy URL. |
public String toString() | Vráti reťazcovú reprezentáciu adresy URL. |
public String getQuery() | Vráti reťazec dotazu adresy URL. |
public int getDefaultPort() | Vráti predvolený port adresy URL. |
public URLConnection openConnection() | Vráti inštanciu URLConnection , tj pridruženú k tejto
URL. |
public boolean equals(Object obj) | Porovnáva URL s daným objektom. |
public Object getContent() | Vráti obsah adresy URL. |
public String getRef() | Vráti kotvu alebo odkaz adresy URL. |
public URI toURI() | Vráti URI adresy URL. |
Komponenty URL
Ako už bolo spomenuté adresa URL sa skladá z niekoľkých komponentov. Tie je možné získať pomocou vyššie popísaných metód. Poďme si to skúsiť. Upravíme náš kód do nasledujúcej podoby:// komponenty URL try { // vytvoření absolutní adresy URL URL zakladniAdresa = new URL("https://www.itnetwork.cz"); // vytvoření relativní adresy URL URL relativniAdresa = new URL(zakladniAdresa, "java-networking-uvod"); // tisk řetězcové reprezentace adresy URL System.out.println("Reprezentace adresy URL (relativní): " + relativniAdresa.toString()); System.out.println(); // komponenty URL System.out.println("Protokol: " + relativniAdresa.getProtocol()); System.out.println("Název hostitele: " + relativniAdresa.getHost()); System.out.println("Číslo portu: " + relativniAdresa.getPort()); System.out.println("Název souboru: " + relativniAdresa.getFile()); } catch (MalformedURLException e) { System.out.println(e); }
Kód spustíme:
Konzolová aplikácia
Reprezentace adresy URL (relativní): https://www.itnetwork.cz/java-networking-uvod
Protokol: https
Název hostitele: www.itnetwork.cz
Číslo portu: -1
Název souboru: /java-networking-uvod
Ako sme si už vyššie uviedli, číslo portu je voliteľný atribút. Ak
teda číslo portu nie je uvedené v URL, metóda getPort()
vráti
-1
.
Skúsme si ešte vytvoriť iný objekt URL a znova vypísať komponenty:
System.out.println(); URL url = new URL("https://www.google.com/search?q=itnetwork&oq=itnetwork&aqs=chrome..69i57j0i512l4j0i10i512j0i512l4.6501j0j15&sourceid=chrome&ie=UTF-8"); // tisk řetězcové reprezentace adresy URL System.out.println("Reprezentace adresy URL: " + url.toString()); // komponenty URL System.out.println("Protokol: " + url.getProtocol()); System.out.println("Název hostitele: " + url.getHost()); System.out.println("Číslo portu: " + url.getPort()); System.out.println("Výchozí číslo portu: " + url.getDefaultPort()); System.out.println("Řetězec dotazu: " + url.getQuery()); System.out.println("Cesta: " + url.getPath()); System.out.println("Soubor: " + url.getFile());
Pozrime sa na výsledok:
Konzolová aplikácia
Reprezentace adresy URL (relativní): https://www.itnetwork.cz/java-networking-uvod
Protokol: https
Název hostitele: www.itnetwork.cz
Číslo portu: -1
Název souboru: /java-networking-uvod
Reprezentace adresy URL: https://www.google.com/search?q=itnetwork&oq=itnetwork&aqs=chrome..69i57j0i512l4j0i10i512j0i512l4.6501j0j15&sourceid=chrome&ie=UTF-8
Protokol: https
Název hostitele: www.google.com
Číslo portu: -1
Výchozí číslo portu: 443
Řetězec dotazu: q=itnetwork&oq=itnetwork&aqs=chrome..69i57j0i512l4j0i10i512j0i512l4.6501j0j15&sourceid=chrome&ie=UTF-8
Cesta: /search
Soubor: /search?q=itnetwork&oq=itnetwork&aqs=chrome..69i57j0i512l4j0i10i512j0i512l4.6501j0j15&sourceid=chrome&ie=UTF-8
Čítanie priamo z URL
Po úspešnom vytvorení objektu triedyURL
z neho môžeme
čítať dáta. Na to slúži metóda openStream()
, ktorá vracia
štandardný stream na čítanie java.io.InputStream
, preto
môžeme použiť jej metódy (napr. read()
).
Metóda openStream()
je iba skrátené volanie
openConnection().getInputStream()
a môže vyvolať výnimku
IOException
Nasledujúca úprava nášho programu ukazuje, aké jednoduché je čítanie z URL:
try { // vytvoření absolutní adresy URL URL zakladniAdresa = new URL("https://www.itnetwork.cz"); // vytvoření relativní adresy URL URL relativniAdresa = new URL(zakladniAdresa, "java-networking-uvod"); DataInputStream stream = new DataInputStream(relativniAdresa.openStream()); int i; while((i = stream.read()) != -1) { System.out.print((char) i); } } catch (MalformedURLException e) { System.out.println("MalformedURLException: " + e); } catch ( IOException ioe ) { System.out.println("IOException: " + ioe); }
Je potrebné naimportovať aj tieto balíčky:
import java.io.DataInputStream; import java.io.IOException;
Posledná ukážka otvorí vstupný stream a zobrazí jeho obsah na displeji. Po spustení uvidíme zdrojový súbor html dokumentu na zadanej adrese. Pokračovať budeme nabudúce.
V budúcej lekcii, Sieť v Jave - Práca s URLConnection , sa zoznámime s triedou java.net.URLConnection, uvedieme si niektoré jej metódy a ukážeme si aj praktické príklady ich použitia.