mrezno racunarstvo

36
Mrezno racunarstvo Mrezno racunarstvo glava 7 glava 7 URLs and URIs URLs and URIs

Upload: cachez

Post on 05-Jan-2016

58 views

Category:

Documents


2 download

DESCRIPTION

Mrezno racunarstvo. glava 7 URLs and URIs. klasa URL. klasa URL je najjednostavniji na čin da Java program locira i dobije podatke sa mreže ne treba brinuti o protokolu koji se koristi niti o formatu dobijenih podataka, kao ni o tome kako se komunicira sa serverom - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Mrezno racunarstvo

Mrezno racunarstvoMrezno racunarstvo

glava 7glava 7

URLs and URIsURLs and URIs

Page 2: Mrezno racunarstvo

klasa URLklasa URL

klasa URL je najjednostavniji naklasa URL je najjednostavniji način da Java program čin da Java program locira i dobije podatke sa mreželocira i dobije podatke sa mrežene treba brinuti o protokolu koji se koristi niti o formatu ne treba brinuti o protokolu koji se koristi niti o formatu dobijenih podataka, kao ni o tome kako se komunicira sa dobijenih podataka, kao ni o tome kako se komunicira sa serveromserveromprosto se Javi kaže URL i ona dobije podatke za nas.prosto se Javi kaže URL i ona dobije podatke za nas.u narednim poglavljima se opisuje kako instalirati nove u narednim poglavljima se opisuje kako instalirati nove content i protocol handler-e i proširiti Javine mogućnosti content i protocol handler-e i proširiti Javine mogućnosti da uključe nove protokole i nove tipove podataka. da uključe nove protokole i nove tipove podataka. Takođe, i kako se otvaraju soketi i komunicira direktno Takođe, i kako se otvaraju soketi i komunicira direktno sa različitim vrstama serverasa različitim vrstama serverasada, pogledajmo koliko se može učiniti sa minimumom sada, pogledajmo koliko se može učiniti sa minimumom radarada

Page 3: Mrezno racunarstvo

java.net.URLjava.net.URL

je apstrakcija Uniform Resource Locator-a poput je apstrakcija Uniform Resource Locator-a poput http://hamsterdance.com/ ili ili ftp://ftp.redhat.com/pub/nasleđuje java.lang.Object i final je (ne može se nasleđuje java.lang.Object i final je (ne može se koristiti kao bazna za neku novu klasu)koristiti kao bazna za neku novu klasu)iako bi čuvanje URL-a kao String-a bilo trivijalno, iako bi čuvanje URL-a kao String-a bilo trivijalno, korisno je misliti o URL-ovima kao objektima čija korisno je misliti o URL-ovima kao objektima čija polja uključuju shemu (protokol), hostname, port, polja uključuju shemu (protokol), hostname, port, putanju, query string i fragment (ref) od kojih putanju, query string i fragment (ref) od kojih svako može biti nezavisno postavljeno.svako može biti nezavisno postavljeno.upravo tako je ova klasa i organizovana, s tim upravo tako je ova klasa i organizovana, s tim da detalji variraju u zavisnosti od verzija Javeda detalji variraju u zavisnosti od verzija Jave

Page 4: Mrezno racunarstvo

polja ove klase su vidljiva samo drugim polja ove klase su vidljiva samo drugim članovima java.net paketa, dok im klase koje članovima java.net paketa, dok im klase koje nisu članice ovog paketa ne mogu pristupati nisu članice ovog paketa ne mogu pristupati direktnodirektnoipak, moguće je postaviti ova polja korišćenjem ipak, moguće je postaviti ova polja korišćenjem URL konstruktora i dobiti njihove vrednosti URL konstruktora i dobiti njihove vrednosti korišćenjem različitih get*() metoda (getHost(), korišćenjem različitih get*() metoda (getHost(), getPort()...)getPort()...)URL je efektivno nepromenljiv. Nakon kreiranja URL je efektivno nepromenljiv. Nakon kreiranja URL objekta, njegova polja se ne menjaju. Bočni URL objekta, njegova polja se ne menjaju. Bočni efekat je da su thread-safeefekat je da su thread-safe

Page 5: Mrezno racunarstvo

Kreiranje novih URL-ovaKreiranje novih URL-ovamoguće je kreirati instance klase java.net.URLmoguće je kreirati instance klase java.net.URLpostoji nekoliko konstruktorapostoji nekoliko konstruktorasvi oni izbacuju MalformedURLException ako pokušamo da kreiramo URL svi oni izbacuju MalformedURLException ako pokušamo da kreiramo URL za nepodržani protokol ili ako je URL sintaksno neispravanza nepodržani protokol ili ako je URL sintaksno neispravanKoji su tačno protokoli podržani zavisi od platformeKoji su tačno protokoli podržani zavisi od platformejedini protokoli koji su dostupni u svim osnovnim VM su http i filejedini protokoli koji su dostupni u svim osnovnim VM su http i fileJava 1.5 takođe zahteva da VMJava 1.5 takođe zahteva da VM podržava https, jar i ftppodržava https, jar i ftpvećina VM takođe podržava ftp, mailto i gopher kao i protokole poput doc, većina VM takođe podržava ftp, mailto i gopher kao i protokole poput doc, netdoc, systemresource i verbatim koje Java interno koristinetdoc, systemresource i verbatim koje Java interno koristiMicrosoft VM podržava http, file, ftp, https, mailto, gopher, doc i Microsoft VM podržava http, file, ftp, https, mailto, gopher, doc i systemresource, ali ne telnet, netdoc, jar ili verbatimsystemresource, ali ne telnet, netdoc, jar ili verbatimPodrška za sve ove protokole je u apletima ograničena security policy-jem.Podrška za sve ove protokole je u apletima ograničena security policy-jem.Npr. samo zato što nepoverljivi aplet može konstruisati URL objekat od Npr. samo zato što nepoverljivi aplet može konstruisati URL objekat od URL-a fajla ne znači da aplet zaista može i čitati taj fajlURL-a fajla ne znači da aplet zaista može i čitati taj fajlAko protokol koji nam treba nije podržan od strane određene VM, možemo Ako protokol koji nam treba nije podržan od strane određene VM, možemo instalirati protocol handler za tu shemu. To je praktično samo za aplikacije instalirati protocol handler za tu shemu. To je praktično samo za aplikacije (ne i za aplete, jer je predmet brojnih sigurnosnih provera)(ne i za aplete, jer je predmet brojnih sigurnosnih provera)

Page 6: Mrezno racunarstvo

Osim provere da li prepoznaje URL shemu, Java ne vrši Osim provere da li prepoznaje URL shemu, Java ne vrši nikakve provere ispravnosti URL-a koji konstruišenikakve provere ispravnosti URL-a koji konstruišeProgramer je odgovoran za ispravnost URL-ova.Programer je odgovoran za ispravnost URL-ova.npr. Java ne proverava da hostname u HTTP URL-u ne npr. Java ne proverava da hostname u HTTP URL-u ne sadrži beline ili da li je query string x-www-form-URL-sadrži beline ili da li je query string x-www-form-URL-encoded. ne proverava da mailto URL zaista sadrži encoded. ne proverava da mailto URL zaista sadrži email adresu. ne proverava da li URL pokazuje na email adresu. ne proverava da li URL pokazuje na postojeći host itd.postojeći host itd.moguće je kreirati URL-ove za host-ove koji ne postoje ili moguće je kreirati URL-ove za host-ove koji ne postoje ili koji postoje, ali nije dopušteno konektovati se na njihkoji postoje, ali nije dopušteno konektovati se na njih

Page 7: Mrezno racunarstvo

Konstruisanje URL-a od String-aKonstruisanje URL-a od String-a

jedini argument – String sa apsolutnim URL-omjedini argument – String sa apsolutnim URL-ompublic URL(String url) throws MalformedURLExceptionpublic URL(String url) throws MalformedURLExceptiontrytry{{

URL u = new URL u = new URL(URL(”http://www.audubon.org/”);”); }catch(Malformed}catch(MalformedURLURLException ex){Exception ex){ System.err.println(ex);System.err.println(ex); }}

primer 1primer 1jednostavan program za odrejednostavan program za određivanje koje protokole podržava VM. đivanje koje protokole podržava VM. Pokušava da konstruiše URL objekat za svaki od 14 protokola (8 Pokušava da konstruiše URL objekat za svaki od 14 protokola (8 standardnih, 3 custom protokola za različite Java API-je i 4 standardnih, 3 custom protokola za različite Java API-je i 4 nedokumentovana koje interno koristi HotJava) Ako konstruktor nedokumentovana koje interno koristi HotJava) Ako konstruktor uspe, znamo da je protokol podržan. Inače, izbacuje se uspe, znamo da je protokol podržan. Inače, izbacuje se MalformedURLException i znamo da protokol nije podržan.MalformedURLException i znamo da protokol nije podržan.

Page 8: Mrezno racunarstvo

Konstruisanje URL-a od komponentiKonstruisanje URL-a od komponenti

od 3 stringa koja zadaju protokol, hostname i fileod 3 stringa koja zadaju protokol, hostname i filepublic URL(String protocol, String hostname, String file) throws public URL(String protocol, String hostname, String file) throws MalformedURLExceptionMalformedURLExceptionovaj konstruktor postavlja port na -1 tako da će biti korišćen podrazumevani port za ovaj konstruktor postavlja port na -1 tako da će biti korišćen podrazumevani port za protokolprotokolargument file treba da počinje sa / i da uključi putanju, ime fajla i opciono fragment. argument file treba da počinje sa / i da uključi putanju, ime fajla i opciono fragment. Zaboravljanje početnog / je uobičajena greška koja se ne uočava lakoZaboravljanje početnog / je uobičajena greška koja se ne uočava lakotrytry{{

URL u = new URL(”http”, ”URL u = new URL(”http”, ”www.eff.org”, ”, ” ”/blueribbon.html#intro”);/blueribbon.html#intro”); } catch(MalformedURLException ex){} catch(MalformedURLException ex){ // All VMs should recognize http// All VMs should recognize http }}

ovim se kreira objekat koji pokazuje na ovim se kreira objekat koji pokazuje na http://www.eff.ofg/blueribbon.html#intro koji koji koristi podrazumevani port za HTTP protokol (port 80). Specifikacija fajla ukljukoristi podrazumevani port za HTTP protokol (port 80). Specifikacija fajla uključuje čuje referencu na imenovano sidroreferencu na imenovano sidro

Page 9: Mrezno racunarstvo

U retkim situacijama kada podrazumevani port nije ispravan, sledeći U retkim situacijama kada podrazumevani port nije ispravan, sledeći konstruktor dopušta da se port eksplicitno zada kao int:konstruktor dopušta da se port eksplicitno zada kao int:public URL(String protocol, String host, int port, String file) throws public URL(String protocol, String host, int port, String file) throws MalformedURLExceptionMalformedURLExceptiontrytry{{

URL u = new URL(”http”, ”fourier.dur.ac.uk”, 8000, URL u = new URL(”http”, ”fourier.dur.ac.uk”, 8000, ”/~dma3mjh/jsci/”);”/~dma3mjh/jsci/”);}catch(MalformedURLException ex){}catch(MalformedURLException ex){

System.err.println(ex);System.err.println(ex);}}kreira URL koji pokazuje na kreira URL koji pokazuje na http://fourier.dur.ac.uk:8000/~dma3mjh/jsci gde je port 8000 gde je port 8000 eksplicitno zadateksplicitno zadat

Page 10: Mrezno racunarstvo

Konstruisanje relativnih URL-ovaKonstruisanje relativnih URL-ova

Konstruktor gradi apsolutni URL od relativnog Konstruktor gradi apsolutni URL od relativnog URL i baznog URL:URL i baznog URL:public URL(URL base, String relative) throws public URL(URL base, String relative) throws MalformedURLExceptionMalformedURLExceptionnpr. npr. ako parsiramo HTML dokument na ako parsiramo HTML dokument na http://www.ibiblio.org/javafaq/index.html i i nađemo link na fajl mailinglists.html bez daljih nađemo link na fajl mailinglists.html bez daljih kvalifikujućih informacija, koristimo URL kvalifikujućih informacija, koristimo URL dokumenta koji sadrži link kako bismo obezbedili dokumenta koji sadrži link kako bismo obezbedili informacije koje nedostajuinformacije koje nedostaju

Page 11: Mrezno racunarstvo

trytry{{URL u1 = new URL(”http://www.ibiblio.org/javafaq/index.html”);URL u1 = new URL(”http://www.ibiblio.org/javafaq/index.html”);

URL u2 = new URL(u1, ”mailinglists.html”);URL u2 = new URL(u1, ”mailinglists.html”);}catch(MalformedURLException ex){}catch(MalformedURLException ex){

System.err.println(ex);System.err.println(ex);}}Ime fajla se uklanja iz putanje u1, a zatim se nadovezuje ime fajla mailinglists.html i Ime fajla se uklanja iz putanje u1, a zatim se nadovezuje ime fajla mailinglists.html i pravi u2.pravi u2.ovaj konstruktor je posebno koristan kada ovaj konstruktor je posebno koristan kada želimo da prolazimo kroz listu fajlova koji želimo da prolazimo kroz listu fajlova koji su svi u istom direktorijumu. Može se kreirati URL za prvi fajl, a potom koristiti za su svi u istom direktorijumu. Može se kreirati URL za prvi fajl, a potom koristiti za kreiranje URL objekata drugih fajlova zamenom njihovih imena.kreiranje URL objekata drugih fajlova zamenom njihovih imena.ovaj konstruktor se takođe koristi kada se želi kreirati URL relativan u odnosu na ovaj konstruktor se takođe koristi kada se želi kreirati URL relativan u odnosu na document base ili code base apleta, koji se mogu dobiti sa getDocumentBase() i document base ili code base apleta, koji se mogu dobiti sa getDocumentBase() i getCodeBase() klase JApplet.getCodeBase() klase JApplet.primer 2primer 2jednostavan aplet koji koristi getDocumentBase() za kreiranje novog URL objektajednostavan aplet koji koristi getDocumentBase() za kreiranje novog URL objektakada se koristi ovaj konstruktor sa getDocumentBase(), često se poziv kada se koristi ovaj konstruktor sa getDocumentBase(), često se poziv getDocumentBase() smešta unutar konstruktora:getDocumentBase() smešta unutar konstruktora:URL relative = new URL(this.getDocumentBase(), ”mailinglists.html”);URL relative = new URL(this.getDocumentBase(), ”mailinglists.html”);

Page 12: Mrezno racunarstvo

Zadavanje URLStreamHandler-aZadavanje URLStreamHandler-a

2 konstruktora dopuštaju zadavanje protocol handler-a 2 konstruktora dopuštaju zadavanje protocol handler-a koji se koristi za URLkoji se koristi za URLpublic URL(URL base, String relative, public URL(URL base, String relative, URLStreamHandler handler) throws URLStreamHandler handler) throws MalformedURLExceptionMalformedURLExceptionpublic URL(String protocol, String host, int port, String public URL(String protocol, String host, int port, String file, URLStreamHandler handler) throws file, URLStreamHandler handler) throws MalformedURLExceptionMalformedURLExceptionSvi URL objekti imaju URLStreamHandler objekte koji Svi URL objekti imaju URLStreamHandler objekte koji rade posao za njih. Ovi konstruktori su korisni za rad sa rade posao za njih. Ovi konstruktori su korisni za rad sa URL-ovima čije sheme nisu podržane u određenoj VM, URL-ovima čije sheme nisu podržane u određenoj VM, kao i za dodavanje funkcionalnosti koje podrazumevani kao i za dodavanje funkcionalnosti koje podrazumevani stream handler ne pruža, poput traženja korisničkog stream handler ne pruža, poput traženja korisničkog imena i šifre korisnikaimena i šifre korisnika

Page 13: Mrezno racunarstvo

Drugi izvori URL objekataDrugi izvori URL objekata

Osim opisanih konstruktora, brojni drugi metodi Osim opisanih konstruktora, brojni drugi metodi Javine biblioteke klasa vraćaju URL objekteJavine biblioteke klasa vraćaju URL objekte

getDocumentBase() klase JgetDocumentBase() klase JAAppletpplet

getCodeBase() – vraća URL samog apleta getCodeBase() – vraća URL samog apleta umesto URL-a stranice koja sadrži apletumesto URL-a stranice koja sadrži aplet

toURL() metod klase java.io.File vraća URL fajla. toURL() metod klase java.io.File vraća URL fajla. Tačan format vraćenog URL-a fajla platformski Tačan format vraćenog URL-a fajla platformski je zavisan. U praksi, file URL-ovi su jako je zavisan. U praksi, file URL-ovi su jako platformski i programski zavisni.platformski i programski zavisni.

Page 14: Mrezno racunarstvo

Loaderi klasa ne učitavaju samo klase, već i Loaderi klasa ne učitavaju samo klase, već i resurse poput slika i audio fajlova. Statički resurse poput slika i audio fajlova. Statički metod ClassLoader.getSystemResource(String metod ClassLoader.getSystemResource(String name) vraća URL pojedinačnog resursa.name) vraća URL pojedinačnog resursa.ClassLoader.getSystemResources(String name) ClassLoader.getSystemResources(String name) vraća Enumeration koja sadrži listu URL-ova sa vraća Enumeration koja sadrži listu URL-ova sa kojih imenovani resurs može biti pročitankojih imenovani resurs može biti pročitaninstancni metod getResource(String name) instancni metod getResource(String name) prepretražtražujeuje putanju koju koristi loader klase kako putanju koju koristi loader klase kako bi pronašao URL imenovanog resursabi pronašao URL imenovanog resursa

Page 15: Mrezno racunarstvo

URI može biti konvertovan u URL URI može biti konvertovan u URL korišćenjem metoda toURL()korišćenjem metoda toURL()Postoji još nekolicina metoda koji vraćaju Postoji još nekolicina metoda koji vraćaju URL objekte, ali to su uglavnom prosti URL objekte, ali to su uglavnom prosti getter metodi koji samo vraćaju URL koji getter metodi koji samo vraćaju URL koji verovatno već znamo jer smo ga koristili verovatno već znamo jer smo ga koristili za konstruisanje objekta: getPage() klase za konstruisanje objekta: getPage() klase java.swing.JEditorPane i getURL() klase java.swing.JEditorPane i getURL() klase java.net.URLConnectionjava.net.URLConnection

Page 16: Mrezno racunarstvo

Rastavljanje URL-a na deloveRastavljanje URL-a na delove

URL se sastoji iz 5 delova: URL se sastoji iz 5 delova: 1.1. shema ili protokolshema ili protokol2.2. authorityauthority3.3. pathpath4.4. fragment/section/reffragment/section/ref5.5. query stringquery string

http://www.ibiblio.org/javafaq/books/jnp/index.html?isbn=1565922069#tocshema je httpshema je httpauthority authority www.ibiblio.orgpath /javafaq/books/jnp/index.htmlpath /javafaq/books/jnp/index.htmlfragment tocfragment tocquery string isbn=1565922069query string isbn=1565922069Međutim, nemaju svi URL-ovi sve ove deloveMeđutim, nemaju svi URL-ovi sve ove delove

Page 17: Mrezno racunarstvo

authority može dalje biti podeljen na user authority može dalje biti podeljen na user info, host i portinfo, host i port

http://[email protected]:8080/

authority je authority je [email protected]:8080

user info je adminuser info je admin

host host www.blackstar.com

port 8080port 8080

Page 18: Mrezno racunarstvo

pristup za pristup za čitanje ovih delova URL-a čitanje ovih delova URL-a obezbeđen je sa sledećih 5 public metoda:obezbeđen je sa sledećih 5 public metoda:

getFile(), getHost(), getPort(), getFile(), getHost(), getPort(), getProtocol() i getRef()getProtocol() i getRef()

getQuery(), getPath(), getUserInfo(), getQuery(), getPath(), getUserInfo(), getAuthority()getAuthority()

primeri korišćenja su ubačeni u primer2primeri korišćenja su ubačeni u primer2

Page 19: Mrezno racunarstvo

getProtocol() vraća String: ”http”, ”https” ili ”file”getProtocol() vraća String: ”http”, ”https” ili ”file”getHost() vraća String koji sadrži hostname getHost() vraća String koji sadrži hostname URL-aURL-agetPort() vraća broj porta zadatog u URL-u kao getPort() vraća broj porta zadatog u URL-u kao int. Ako nije zadat port, vraća -1, da označi da int. Ako nije zadat port, vraća -1, da označi da URL ne zadaje port eksplicitno i da će biti URL ne zadaje port eksplicitno i da će biti korišćen podrazumevani port za protokolkorišćen podrazumevani port za protokolgetDefaultPort() vraća podrazumevani port koji getDefaultPort() vraća podrazumevani port koji koristi protokol URL-a. Ako za protokol nije koristi protokol URL-a. Ako za protokol nije definisan podrazumevani port, metod vraća -1definisan podrazumevani port, metod vraća -1

Page 20: Mrezno racunarstvo

getFile() vraća String koji sadrži deo URL-a koji se getFile() vraća String koji sadrži deo URL-a koji se odnosi na putanju. Java ne razbija URL u posebne odnosi na putanju. Java ne razbija URL u posebne delove za putanju i ime fajla. Sve od prvog / nakon delove za putanju i ime fajla. Sve od prvog / nakon hostname-a pa do karaktera koji prethodi # kojim počinje hostname-a pa do karaktera koji prethodi # kojim počinje fragment smatra se delom fajla. Ako URL nema taj deo, fragment smatra se delom fajla. Ako URL nema taj deo, metod vraća prazan stringmetod vraća prazan stringgetPath() skoro sinonim za getFile(), tj. vraća String koji getPath() skoro sinonim za getFile(), tj. vraća String koji sadrži putanja i fajl deo URL-a. Ipak, za razliku od sadrži putanja i fajl deo URL-a. Ipak, za razliku od getFile(), ne uključuje query string u String koji vraća, getFile(), ne uključuje query string u String koji vraća, već samo putanjuveć samo putanjuprimedba: ni getFile() ne vraća samo ime fajla, ni primedba: ni getFile() ne vraća samo ime fajla, ni getPath() ne vraća samo putanju, kao što bi se dalo getPath() ne vraća samo putanju, kao što bi se dalo očekivati. Oba vraćaju punu putanju i ime fajla. Razlika očekivati. Oba vraćaju punu putanju i ime fajla. Razlika je samo u tome što getFile() vraća i query string, a je samo u tome što getFile() vraća i query string, a getPath() negetPath() ne

Page 21: Mrezno racunarstvo

getRef() vraća fragment deo URL-a, ako URL nema taj deo, metod vraća getRef() vraća fragment deo URL-a, ako URL nema taj deo, metod vraća nullnullgetQuery() vraća query string URL-a, ako ga nema u URL, metod vraća nullgetQuery() vraća query string URL-a, ako ga nema u URL, metod vraća nullgetUserInfo() – neki URL-ovi uključuju i korisničko ime, a povremeno i getUserInfo() – neki URL-ovi uključuju i korisničko ime, a povremeno i informaciju o šifri. Ovi delovi idu nakon sheme, a pre host-a i razdvojeni su informaciju o šifri. Ovi delovi idu nakon sheme, a pre host-a i razdvojeni su simbolom simbolom @@..http://[email protected] – user info je elharo – user info je elharoftp://mp3:[email protected]/%3a/stuff/mp3 user info je mp3:secret. user info je mp3:secret. Veći deo vremena uključivanje šifre u URL je bezbednosni rizik. Ako URL Veći deo vremena uključivanje šifre u URL je bezbednosni rizik. Ako URL nema user info, metod vraća nullnema user info, metod vraća nullmailto URL-ovi se mogu ponašati drugačije nego što očekujemo: u URL-u mailto URL-ovi se mogu ponašati drugačije nego što očekujemo: u URL-u poput poput mailto:[email protected] elharo elharo@@metalab.unc.edu je putanja, metalab.unc.edu je putanja, a ne user info i host.a ne user info i host.getAuthority() – između sheme i putanje URL-a nalazi se authority. To je getAuthority() – između sheme i putanje URL-a nalazi se authority. To je autoritet koji razrešava resurs. U najopštijem slučaju, autoritet uključuje user autoritet koji razrešava resurs. U najopštijem slučaju, autoritet uključuje user info, host i port. Međutim, nemaju svi URL-ovi sve deloveinfo, host i port. Međutim, nemaju svi URL-ovi sve delove

Page 22: Mrezno racunarstvo

Dobijanje podataka iz URL-aDobijanje podataka iz URL-a

podaci sadržani u dokumentima na koje pokazuju URL-podaci sadržani u dokumentima na koje pokazuju URL-oviovipostoji nekoliko metoda za dohvatanje tih podataka iz postoji nekoliko metoda za dohvatanje tih podataka iz URL-aURL-apublic InputStream openStream() throws IOExceptionpublic InputStream openStream() throws IOExceptionpublic URLConnection openConnection() throws public URLConnection openConnection() throws IOExceptionIOExceptionpublic URLConnection openConnection(Proxy proxy) public URLConnection openConnection(Proxy proxy) throws IOExceptionthrows IOExceptionpublic Object getContent() throws IOExceptionpublic Object getContent() throws IOExceptionpublic Object getContent(Classpublic Object getContent(Class[] classes) IOException[] classes) IOExceptionOvi metodi se razlikuju po tome Ovi metodi se razlikuju po tome što vraćaju podatke sa što vraćaju podatke sa URL-a kao instance različitih klasaURL-a kao instance različitih klasa

Page 23: Mrezno racunarstvo

public final InputStream public final InputStream openStream() throws IOExceptionopenStream() throws IOExceptionovaj metod se konektuje na resurs referisan ovaj metod se konektuje na resurs referisan URL-om, vrši neophodan handshaking između URL-om, vrši neophodan handshaking između klijenta i servera, i vraća InputStream iz koga se klijenta i servera, i vraća InputStream iz koga se mogu čitati podaci. Podaci koji se mogu dobiti iz mogu čitati podaci. Podaci koji se mogu dobiti iz InputStream predstavljaju sirovi sadržaj fajla na InputStream predstavljaju sirovi sadržaj fajla na koji referiše URL (ASCII ako čitamo ASCII fajl, koji referiše URL (ASCII ako čitamo ASCII fajl, HTML ako čitamo HTML fajl itd.) Oni ne HTML ako čitamo HTML fajl itd.) Oni ne uključuju nikakva HTTP zaglavlja i nikakve druge uključuju nikakva HTTP zaglavlja i nikakve druge informacije vezane za protokolinformacije vezane za protokolMožemo čitati iz ovog InputStream kao i iz bilo Možemo čitati iz ovog InputStream kao i iz bilo kog drugogkog drugog

Page 24: Mrezno racunarstvo

trytry{{URL u = new URL u = new

URL(”http://www.hamsterdance.com”);URL(”http://www.hamsterdance.com”);InputStream in = u.openStream();InputStream in = u.openStream();int c;int c;while((c=in.read())!=-1)while((c=in.read())!=-1)

System.out.write(c);System.out.write(c);} catch(IOException ex){} catch(IOException ex){

System.err.println(ex);System.err.println(ex);}}

MalformedURLException je potklasa od IOException (isti MalformedURLException je potklasa od IOException (isti catch hvata oba)catch hvata oba)

Page 25: Mrezno racunarstvo

primer 3 primer 3 čita URL iz komandne linije, otvara InputStream za taj URL, čita URL iz komandne linije, otvara InputStream za taj URL, ulančava rezultujući InputStraam na InputStreamReader koristeći ulančava rezultujući InputStraam na InputStreamReader koristeći podrazumevano kodiranje i zatim koristi metod read() podrazumevano kodiranje i zatim koristi metod read() InputStreamReader-a da čita uzastopne karaktere iz fajla, od kojih InputStreamReader-a da čita uzastopne karaktere iz fajla, od kojih svaki štampa na System.out. Tako, štampa sirove podatke svaki štampa na System.out. Tako, štampa sirove podatke smeštene na URL (ako URL referiše HTML fajl, izlaz programa je smeštene na URL (ako URL referiše HTML fajl, izlaz programa je HTML)HTML)ovaj program pretpostavlja da je udaljeni URL tekst, što nije nužno ovaj program pretpostavlja da je udaljeni URL tekst, što nije nužno tačno. Može biti i GIF, JPEG ili MP3 ili nešto potpuno drugo. Čak i tačno. Može biti i GIF, JPEG ili MP3 ili nešto potpuno drugo. Čak i ako je tekst, kodiranje ne mora biti isto kao podrazumevano ako je tekst, kodiranje ne mora biti isto kao podrazumevano kodiranje na klijentskom sistemu.kodiranje na klijentskom sistemu.HTTP zaglavlje koje prethodi dokumentu ima sopstvenu informaciju HTTP zaglavlje koje prethodi dokumentu ima sopstvenu informaciju o kodiranju koja može biti potpuno suprotna onoj koju o sebi kaže o kodiranju koja može biti potpuno suprotna onoj koju o sebi kaže dokument (npr. META tag za HTML). Ne možemo čitati ovo dokument (npr. META tag za HTML). Ne možemo čitati ovo zaglavlje koristeći URL klasu, ali možemo URLConnection objektom zaglavlje koristeći URL klasu, ali možemo URLConnection objektom koji vraća metod openConnection()koji vraća metod openConnection()

Page 26: Mrezno racunarstvo

public URLConnection public URLConnection openConnection() throws IOExceptionopenConnection() throws IOException

otvara soket za zadati URL i vraća URLConnection objekat koji predstavlja otvorenu konekciju do otvara soket za zadati URL i vraća URLConnection objekat koji predstavlja otvorenu konekciju do mrežnog resursamrežnog resursatrytry{{

URL u = new URL(”http://jennicam.org/”);URL u = new URL(”http://jennicam.org/”);try{try{

URLConnection uc = u.openConnection();URLConnection uc = u.openConnection();InputStream in = uc.getInputStream();InputStream in = uc.getInputStream();// read from the connection …// read from the connection …

}catch(IOException ex){}catch(IOException ex){System.err.println(ex);System.err.println(ex);

}}}catch(MalformedURLException ex){}catch(MalformedURLException ex){

System.err.println(ex);System.err.println(ex);}}Ovaj metod se koristi kada se Ovaj metod se koristi kada se želi direktno komunicirati sa serverom. URLConnection nam daje želi direktno komunicirati sa serverom. URLConnection nam daje pristup svemu što je server poslao dodatno uz sam dokument u neobrađenoj formi (HTML, plain pristup svemu što je server poslao dodatno uz sam dokument u neobrađenoj formi (HTML, plain text, binary image data itd)text, binary image data itd)Npr. ako je shema HTTP, URLConnection dopušta da pristupimo HTTP zaglavljima kao i HTML-Npr. ako je shema HTTP, URLConnection dopušta da pristupimo HTTP zaglavljima kao i HTML-u.u.URLConnection takođe dopušta da se podaci pišu kao i da se čitaju iz URL-a, npr. u cilju da se URLConnection takođe dopušta da se podaci pišu kao i da se čitaju iz URL-a, npr. u cilju da se pošalje email mailto URL-u ili da se postuju podaci iz forme. (URLConnection je osnovna tema pošalje email mailto URL-u ili da se postuju podaci iz forme. (URLConnection je osnovna tema poglavlja 15)poglavlja 15)postoji i varijanta metoda koja zadaje proxy server kroz koji prolazi konekcija. Ako protocol postoji i varijanta metoda koja zadaje proxy server kroz koji prolazi konekcija. Ako protocol handler ne podržava proxy-je argument se ignoriše i konekcija se pravi direktno, ako je mogućehandler ne podržava proxy-je argument se ignoriše i konekcija se pravi direktno, ako je moguće

Page 27: Mrezno racunarstvo

public final Object getContent() public final Object getContent() throws IOExceptionthrows IOException

dohvata podatke referisane URL-om i pokušava dohvata podatke referisane URL-om i pokušava da ih pretvori u objekat nekog tipada ih pretvori u objekat nekog tipaako URL referiše na neki tekstualni objekat, ako URL referiše na neki tekstualni objekat, poput ASCII ili HTML fajla, vraćeni objekat je poput ASCII ili HTML fajla, vraćeni objekat je obično neka vrsta InputStream-a.obično neka vrsta InputStream-a.ako URL referiše na sliku poput GIF ili JPEG ako URL referiše na sliku poput GIF ili JPEG fajla, metod obično vraća fajla, metod obično vraća java.awt.ImageProducer (tj. instancu klase koja java.awt.ImageProducer (tj. instancu klase koja implementira ovaj interfejs)implementira ovaj interfejs)Ove dve klase nisu stvari same po sebi, već Ove dve klase nisu stvari same po sebi, već sredstva pomoću kojih program može sredstva pomoću kojih program može konstruisati stvar.konstruisati stvar.

Page 28: Mrezno racunarstvo

trytry{{URL u = new URL(”http://mesola.obspm.fr/”);URL u = new URL(”http://mesola.obspm.fr/”);

Object o = u.getContent();Object o = u.getContent();// cast the Object to the appropriate type// cast the Object to the appropriate type// work with the Object …// work with the Object …

}catch(Exception ex){}catch(Exception ex){System.err.println(ex);System.err.println(ex);

}}getContent() radi tako getContent() radi tako što gleda Content-type polje u MIME zaglavlju što gleda Content-type polje u MIME zaglavlju podataka koje dobija od servera. Ako server ne koristi MIME zaglavlja ili podataka koje dobija od servera. Ako server ne koristi MIME zaglavlja ili šalje nepoznati Content-type, getContent vraća neku vrstu InputStream-a iz šalje nepoznati Content-type, getContent vraća neku vrstu InputStream-a iz kog mogu biti pročitani podaci. Izuzetak se izbacuje ako se ne može kog mogu biti pročitani podaci. Izuzetak se izbacuje ako se ne može dohvatiti objekatdohvatiti objekatprimer 4primer 4ovaj primer demonstrira veliki problem sa korišćenjem getContent(): teško je ovaj primer demonstrira veliki problem sa korišćenjem getContent(): teško je predvideti koji tip objekta ćemo dobiti. Provera tipa se jednostavno vrši predvideti koji tip objekta ćemo dobiti. Provera tipa se jednostavno vrši instanceof operatorom.instanceof operatorom.

Page 29: Mrezno racunarstvo

public final Object getContent(Classpublic final Object getContent(Class[] [] classes) throws IOExceptionclasses) throws IOException

mogumogućće je da content handler obezbedi e je da content handler obezbedi razlirazličite prikaze objektačite prikaze objekta

metod dopušta da izaberemo kao objekat metod dopušta da izaberemo kao objekat kojih klasa želimo da objekat bude vraćenkojih klasa želimo da objekat bude vraćen

metod pokušava da vrati sadržaj URL-a metod pokušava da vrati sadržaj URL-a redosledom korišćenim u nizuredosledom korišćenim u nizu

onda se mora koristiti instanceof da bi se onda se mora koristiti instanceof da bi se utvrdilo kog je stvarno tipa vraćeni objekatutvrdilo kog je stvarno tipa vraćeni objekat

Page 30: Mrezno racunarstvo

URL u = new URL(”http://www.nwu.edu”);URL u = new URL(”http://www.nwu.edu”); class[] types = new Class[3];class[] types = new Class[3]; types[0] = String.class;types[0] = String.class; types[1] = Reader.class;types[1] = Reader.class; types[2] = InputStream.class;types[2] = InputStream.class; Object o = u.getContent(types);Object o = u.getContent(types);

if(o instanceof String)if(o instanceof String)System.out.println(o);System.out.println(o);

else if(o instanceof Reader){else if(o instanceof Reader){int c;int c;Reader r = (Reader)o;Reader r = (Reader)o;while((c=r.read()) != -1) System.out.print((char)c);while((c=r.read()) != -1) System.out.print((char)c);

}else if(o instanceof InputStream){}else if(o instanceof InputStream){int c;int c;InputStream in = (InputStream)o;InputStream in = (InputStream)o;while((c=in.read()) != -1) System.out.write(c);while((c=in.read()) != -1) System.out.write(c);

}else}elseSystem.out.println(“Error: unexpected type “ + o.getClass());System.out.println(“Error: unexpected type “ + o.getClass());

Page 31: Mrezno racunarstvo

Utility metodiUtility metodi

za izvrza izvršavanje uobičajenih operacija nad šavanje uobičajenih operacija nad URL-ovimaURL-ovima

sameFile() određuje da li dva URL-a sameFile() određuje da li dva URL-a pokazuju na isti dokumentpokazuju na isti dokument

toExternalForm() konvertuje URL objekat toExternalForm() konvertuje URL objekat u string koji se može koristiti u HTML linku u string koji se može koristiti u HTML linku ili Open URL dijalogu web browser-a.ili Open URL dijalogu web browser-a.

Page 32: Mrezno racunarstvo

public boolean sameFile(URL other)public boolean sameFile(URL other)

poredi odgovarajuća polja na jednakostporedi odgovarajuća polja na jednakostutvrđuje samo da li su 2 hostname aliasi jedno za drugoutvrđuje samo da li su 2 hostname aliasi jedno za drugomože reći da su http://www.ibiblio.org/ i http://metalab.unc.edu/ isti može reći da su http://www.ibiblio.org/ i http://metalab.unc.edu/ isti fajlfajlali ne može reći da su http://www.ibiblio.org:80/ i ali ne može reći da su http://www.ibiblio.org:80/ i http://metalab.unc.edu/ isti fajl ilihttp://metalab.unc.edu/ isti fajl ilida su http://www.cafeonleche.org/ i da su http://www.cafeonleche.org/ i http://www.cafeonleche.org/index.html isti fajlhttp://www.cafeonleche.org/index.html isti fajlmetod je dovoljno pametan da ignoriše fragment deo URL-ametod je dovoljno pametan da ignoriše fragment deo URL-asameFile() metod je sličan equals() metodu klase URL. Glavna sameFile() metod je sličan equals() metodu klase URL. Glavna razlika je u tome što equals() razmatra fragment (ako postoji), dok razlika je u tome što equals() razmatra fragment (ako postoji), dok sameFile() ne. Takođe, proizvoljan objekat može biti prosleđen kao sameFile() ne. Takođe, proizvoljan objekat može biti prosleđen kao argument metoda equals() dok samo URL objekti mogu biti argument metoda equals() dok samo URL objekti mogu biti prosleđeni metodu sameFile().prosleđeni metodu sameFile().

Page 33: Mrezno racunarstvo

public String toExternalForm()public String toExternalForm()

vraća čitljiv String koji predstavlja URL. vraća čitljiv String koji predstavlja URL. Identičan je toString() metodu. Zapravo, Identičan je toString() metodu. Zapravo, toString vraća ono što vrati toString vraća ono što vrati toExternalForm().toExternalForm().

Tako, ovaj metod je redundantan i retko se Tako, ovaj metod je redundantan i retko se koristikoristi

Page 34: Mrezno racunarstvo

public URI toURI() throws public URI toURI() throws URISyntaxExceptionURISyntaxException

konvertuje URL objekat u ekvivalentan konvertuje URL objekat u ekvivalentan URI objekatURI objekat

Za operacije kao što su apsolutizacija i Za operacije kao što su apsolutizacija i kodiranje, treba birati URI klasu, ako kodiranje, treba birati URI klasu, ako postoji mogućnost izbora.postoji mogućnost izbora.

URL klasa treba primarno da se koristi za URL klasa treba primarno da se koristi za stvarno download-ovanje sadržaja sa stvarno download-ovanje sadržaja sa udaljenog serveraudaljenog servera

Page 35: Mrezno racunarstvo

metodi klase Objectmetodi klase Object

equals(), hashcode(), toString()equals(), hashcode(), toString()toString() – String je uvek apsolutni URLtoString() – String je uvek apsolutni URLequals() – objekat je jednak URL-u ako je takođe URL, equals() – objekat je jednak URL-u ako je takođe URL, oba pokazuju na isti fajl, što utvrđuje sameFile(), i oba oba pokazuju na isti fajl, što utvrđuje sameFile(), i oba URL-a imaju isti fragment (ili oba nemaju fragment). URL-a imaju isti fragment (ili oba nemaju fragment). Pošto zavisi od sameFile() metoda, ima ista ograničenja Pošto zavisi od sameFile() metoda, ima ista ograničenja kao i on. Npr. http://www.oreilly.com nije jednak sa kao i on. Npr. http://www.oreilly.com nije jednak sa http://www.oreilly.com/index.html. Takođe, ni http://www.oreilly.com/index.html. Takođe, ni http://www.oreilly.com:80/ nije jednak sa http://www.oreilly.com:80/ nije jednak sa http://www.oreilly.com/. Da li ovo ima smisla zavisi od http://www.oreilly.com/. Da li ovo ima smisla zavisi od toga da li o URL-u mislimo kao o Stringu ili referenci na toga da li o URL-u mislimo kao o Stringu ili referenci na određeni Internet resurs.određeni Internet resurs.hashCode() vraća int koji se koristi kada se URL objekti hashCode() vraća int koji se koristi kada se URL objekti koriste kao ključevi u heš tabelama.koriste kao ključevi u heš tabelama.

Page 36: Mrezno racunarstvo

metodi za Protocol Handler-emetodi za Protocol Handler-e

samo spominjemo, radi kompletnostisamo spominjemo, radi kompletnostipublic static synchronized void public static synchronized void setURLStreamHandlerFactory(URLStreamHandlsetURLStreamHandlerFactory(URLStreamHandlerFactory factory)erFactory factory)primarno ga koriste protocol handler-i odgovorni primarno ga koriste protocol handler-i odgovorni za nove sheme, ne programeri koji žele da za nove sheme, ne programeri koji žele da dohvate podatke od URL-a. (poglavlje 16)dohvate podatke od URL-a. (poglavlje 16)URLStreamHandler je odgovoran za parsiranje URLStreamHandler je odgovoran za parsiranje URL-a i zatim konstruisanja odgovarajućeg URL-a i zatim konstruisanja odgovarajućeg URLConnection objekta koji rukuje konekcijom URLConnection objekta koji rukuje konekcijom sa serverom.sa serverom.