Laboratorio di reti I: Il pacchetto java - The BCIF lossless image … · 2016-02-06 · Modello a...
Transcript of Laboratorio di reti I: Il pacchetto java - The BCIF lossless image … · 2016-02-06 · Modello a...
Laboratorio di reti I: Il pacchetto java.net
Stefano [email protected]
5 novembre, 2008
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 1 / 43
Concetti di base
Modello a strati di una rete
Una rete puo essere modellata con una serie di strati dove ognunorappresenta un diverso livello di astrazione
Proposto nel 1995 il modello OSI:
Applicazione
Presentazione
Sessione
Trasporto
Rete
Data Link
Fisico
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 2 / 43
Concetti di base
Modello a strati di una rete
In fase di trasmissione le informazioni dovrebbero in qualche modopassare per ogni livello prima di essere passate al livello successivo
Le implementazioni dei vari livelli dovrebbero essere indipendenti tradi loro
Nelle reti reali non sempre queste direttive vengono seguiterigidamente
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 3 / 43
Concetti di base
Modello a strati di una rete
Per le comunicazioni in rete viene utilizzato il modello TCP/IP:
IP
TCP UDP
HTTP SMTP FTP
Il protocollo IP (Internet Protocol) corrisponde al livello di rete delmodello osi; per lo smistamento dei pacchetti ad ogni host vieneassegnato un indirizzo detto indirizzo IP
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 4 / 43
Concetti di base
Indirizzi IP
Un indirizzo IP identifica un host con quattro byte rappresentati comenumeri da 0 a 255
Es. 72.14.221.104
Il nuovo protocollo IPv6 in via di introduzione identifichera unamacchina con indirizzi a 16 byte (128 bit)
Alcuni indirizzi hanno significati particolari
127.0.0.1 rappresenta l’host locale (localhost)192.168.*.* sono indirizzi riservati per reti locali (LAN)
Un host puo essere identificato per comodita tramite una stringa (es.www.google.it). Per ottenere l’indirizzo (o uno degli indirizzi) ad essoassociato viene utilizzato il servizio di DNS (Domain Name System)
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 5 / 43
Concetti di base
Paradigmi per la programmazione di reti
Il principale paradigma che vedremo e quello client-server : un hostdetto client richiede un servizio ad un altro detto server che computaun risultato e lo manda in risposta al client
L’esempio piu semplice e la richiesta di una pagina web
Altri possibili paradigmi sono:
Remote evaluation: un host manda del codice ad un altro richiedendoche questo venga eseguitoCode on demand: un host richiede il codice per eseguire unadeterminata operazione
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 6 / 43
Il pacchetto java.net
Il pacchetto java.net
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 7 / 43
Il pacchetto java.net La classe InetAddress
La classe InetAddress
La classe InetAddress rappresenta un indirizzo di rete
Non ha costruttori standard; gli oggetti InetAddress possono essereottenuti tramite i seguenti metodi statici
InetAddress getLocalHost()
Restituisce l’indirizzo dell’host localeInetAddress getByAddress(byte[] addr)
Restituisce l’indirizzo rappresentato dai byte passatiInetAddress getbyName(String host)
InetAddress[] getAllbyName(String host)
Restituiscono uno o tutti gli indirizzi associato all’host specificato,ottenuti interrogando il DNS
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 8 / 43
Il pacchetto java.net La classe InetAddress
Uso di InetAddress
La classe InetAddress offre vari metodi per ottenere informazionisull’indirizzo rappresentato tra cui
String getHostAddress()
Restituisce l’indirizzo IP dell’host locale in forma di stringabyte[] getAddress()
Restituisce l’indirizzo IP dell’host locale in forma di vettore di byteString getHostName()
Restituisce il nome dell’indirizzo rappresentato
Gli oggetti InetAddress potranno inoltre essere utilizzati comeparametri per metodi che creano una connessione
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 9 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Il protocollo TCP
Il protocollo TCP offre numerose funzionalita tra cui
Garanzia di consegna: se un pacchetto non arriva a destinazione questoviene rilevato automaticamente tramite un sistema di acknowledgemente timeout e questo viene ritrasmesso finche non raggiunge il mittenteOrdinamento dei pacchetti: nel caso in cui i pacchetti arrivino aldestinatario in ordine diverso da quello di invio il protocollo esegue unriordinamento; in questo modo la lettura e scrittura su di un canalerisulta sequenziale come sugli altri stream di dati
Grazie a tali garanzie, a livello applicazione possiamo evitare dipreoccuparci di molte problematiche sulla consegna di pacchetti
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 10 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Le socket
Una socket e un’astrazione per un’estremo di una comunicazioneTCP/IP
I dati per la creazione di una socket sono l’indirizzo IP dell’host con ilquale si vuole comunicare e una porta di comunicazione
Una porta e un intero da 1 a 65.535 (216− 1) che verra utilizzato in
fase di comunicazione per distinguere le varie connessioniLe porte tra 1 e 1023 sono considerate riservate per applicazioni eprotocolli ’noti’ (HTTP:80, FTP:21, SMTP:25)
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 11 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Le socket: creazione di una connessione
Una connessione tra un client ed un server tramite socket viene creatatramite i seguenti passi:
Un server resta in attesa di connessioni su una determinata portaUn client richiede una connessione al server sulla porta corrispondenteIl server accetta la connessione dando inizio alla comunicazione
Quando un server accetta una connessione da un client lacomunicazione viene rediretta su di un’altra porta del server in modoche questo possa rimettersi in ascolto per altre connessioni sullastessa porta
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 12 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Classi Socket e ServerSocket
In Java le classi adibite alla gestione delle socket sono Socket eServerSocket
La classe ServerSocket serve per permettere ad un server dirimanere in attesa di una connessione
Vediamo innanzitutto un esempio di funzionamento delle classi;vedremo tutti i loro metodi in dettaglio piu avanti
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 13 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Uso di socket: creazione di una ServerSocket
Innanzitutto un server deve creare una ServerSocket ed attendereconnessioni in ingresso:
ServerSocket ss = new ServerSocket(port);
Socket s = ss.accept();
Al momento della creazione viene specificata la porta su cui stare inattesa; con l’istruzione accept() il server resta in ascolto
Dal momento in cui un client si connette, al server viene restituito unoggetto di tipo Socket da utilizzare per la comunicazione
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 14 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Uso di socket: connessione ad un server
Un client deve quindi connettersi al server in ascolto
Socket s = new Socket(ipAddress, port);
Con questa sitruzione il client si connette al server. L’oggettoipAddress deve essere l’InetAddress corrispondente al server;l’intero port deve essere la porta sulla quale il server e in ascolto
Dalla JDK 1.4, si puo ottenere alternativamente una socket connessain due passi tramite le istruzioni
Socket s = new Socket();
s.connect(new InetSocketAddress(ipAddress, port));
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 15 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Uso di socket: comunicazione
Una volta che una socket e connessa, sia essa lato client o lato server(ottenuta dal metodo accept()) da essa devono venire estratti glistream per la comunicazione
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
A questo punto la comunicazione puo avvenire tramite le solitetecniche di gestione degli stream
Alla terminazione della comunicazione sara necessario chiudere lasocket
s.close();
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 16 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Uso di socket: esempio
Vediamo per un esempio il codice di un server che attendeconnessioni su di una determinata porta e stampa su schermo i datiche gli vengono inviati
ServerSocket ss = new ServerSocket(port);
Socket s = ss.accept();
InputStream in = s.getInputStream();
int readbyte = in.read();
while (readbyte >= 0) {
System.out.print((char)readbyte);
readbyte = in.read();
}
in.close();
s.close();
ss.close();
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 17 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Uso di socket: esempio
Vediamo simmetricamente del codice per l’invio di dati tramite TCP
Se utilizzato per comunicare con un server come quello appenadescritto questo codice potrebbe essere usato per la stampa dimessaggi in remoto
String message = "Messaggio di prova";
Socket s = new Socket(ip, port);
OutputStream out = s.getOutputStream();
out.write(message.getBytes());
out.close();
s.close();
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 18 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Il timeout
Nelle comunicazioni di rete puo succedere che alcuni host nonrispondano per un tempo indefinitamente lungo; in questi casiun’istruzione di lettura bloccherebbe il programma
Per risolvere questo problema si puo impostare un valore detto ditimeout: se dopo una certa quantita di tempo l’istruzione di IO non eterminata, questa viene interrotta e viene generata unaSocketTimeoutException
Il timeout di una socket puo essere impostato tramite il metodosetSoTimeout(int timeout); si puo impostare il timeout anche inuna server socket con l’omonimo metodo per evitare che unaaccept() resti in attesa indefinitamente
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 19 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Metodi di Socket
Riassumendo i principali metodi della classe Socket sono:
Socket() per la creazione di una socket non ancora collegata(disponibile dalla JDK1.4)
Socket(InetAddress address, int port) per la creazione di unasocket connessa all’indirizzo address sulla porta port
getInputStream(), getOutputStream() per ottenere gli stream iningresso ed in uscita della connessione
close() per chiudere la connessione
setSoTimeout(int time) per impostare un valore di timeout
connect(SocketAddres endpoint) e connect(SocketAddres
endpoint, int timeout) per connettersi ad un determinato host,specificando eventualmente un valore di timeout (disponibile dallaJDK1.4)
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 20 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Metodi di Socket
Altri metodi utili di Socket:
isConnected() ritorna true se la socket e ancora connessa
Esistono vari metodi per l’interrogazione di proprieta del socket, tracui getPort(), getLocalPort(), getInetAddress(),
getLocalAddress(), getSoTimeout() ...
Quasi tutti i metodi di Socket lanciano eccezioni derivate daIOException in caso di varie situazioni di errore (per es. host nontrovato o irraggiungibile, timeout scaduto)
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 21 / 43
Il pacchetto java.net Comunicazione tramite connessioni TCP
Metodi di ServerSocket
I principali metodi della classe ServerSocket sono:
ServerSocket(int port), costruttore per la creazione di unaServerSocket associata ad una determinata porta
Socket accept() per stare in ascolto ed ottenere una la Socket diun client che richiede la connessione
setSoTimeout(int time) per impostare un valore di timeout
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 22 / 43
Il pacchetto java.net Esercizio
Esercizio
Realizzare un sistema per la distribuzione di file; un server dovra starein ascolto e mandare un determinato file ai client che ne fannorichiesta. Questi salveranno il file in locale.
Evitare eventuali situazioni di blocco causate da una mancata rispostatramite l’uso di timeout
Progettare o realizzare le seguenti funzionalita:
Rendere possibile la gestione contemporanea di piu client da parte delserver in modo da fornire un servizio continuo. Questo si puo ottenerecreando al momento del collegamento un thread per la gestione di ogniclient e rimettendo il server immediatamente in ascoltoMandare ai client un qualsiasi file richiesto presente sul server (o nellacartella di lavoro). In questo caso al momento della connessione ilserver dovra aspettare che il client mandi la sua richiesta per poirispondere con il file appropriato.
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 23 / 43
Il pacchetto java.net Comunicazione tramite UDP
Il protocollo UDP
Il protocollo UDP ha caratteristiche diverse dal protocollo TCP
UDP non e orientato alla connessione: tra due host non si crea unostream stabile
L’avvio di una comunicazione avviene senza handshaking
La consegna dei pacchetti non e garantita; al contrario i controllisull’integrita vengono eseguiti come in TCP
L’ordine di arrivo dei pacchetti non e necessariamente lo stesso di invio
La comunicazione e perlopiu unidirezionale
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 24 / 43
Il pacchetto java.net Comunicazione tramite UDP
Il protocollo UDP
Uno dei principali vantaggio di UDP e che grazie alla sua semplicitaoffre un servizio molto rapido. In particolare:
Una comunicazione puo iniziare molto rapidamente grazie all’assenzadi handshaking (per questo viene spesso utilizzato per DNS)
Richiede una minore occupazione di banda, soprattutto nella gestionedi pacchetti piccoli, grazie ad un’intestazione molto breve
La banda occupata e minimale grazie anche all’assenza di servizi perl’ordinamento dei pacchetti o per la gestione della congestione di reteforniti invece da TCP
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 25 / 43
Il pacchetto java.net Comunicazione tramite UDP
Il protocollo UDP
Il protocollo UDP puo essere inoltre utile nei seguenti casi:
Quando possiamo permetterci la perdita di alcuni pacchetti (es.streaming di una videoconferenza)
Quando possiamo gestire facilmente un ordine di arrivo dei pacchettidiverso da quello di invio
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 26 / 43
Il pacchetto java.net Comunicazione tramite UDP
La classe DatagramPacket
La classe DatagramPacket rappresenta un pacchetto UDP
Mette a disposizione costruttori per la ricezione di pacchetti tra cui
public DatagramPacket(byte[] buf, int length)
... dove buf rappresenta l’array dove verranno messi i byte delpacchetto e length il numero di byte da leggere, e costruttori perl’invio come
public DatagramPacket(byte[] buf, int length,
InetAddress address, int port)
... dove vengono specificati indirizzo e porta di destinazione, oltre alnumero length di byte da inviare
Esistono altri costruttori che permettono anche di specificare unoffset, cioe un punto del vettore b dove iniziano i byte da inviare oricevere
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 27 / 43
Il pacchetto java.net Comunicazione tramite UDP
La classe DatagramPacket
La classe DatagramPacket mette a disposizione vari metodi peraccedere alle informazioni contenute nel pacchetto rappresentato:
byte[] getData(), int getLength()
Utili ad ottenere il vettore di byte contenuti e la lunghezza delpacchetto; da usare dopo la ricevione del pacchettoInetAddress[] getAddress(), int getPort()
Da usare per ottenere indirizzo e porta dell’host remoto che hamandato o ricevuto il pacchettovoid setAddress(InetAddress addr), void setPort(int p),
void setData(byte[] b), void setLength(int l)
Per impostare i vari campi del pacchetto
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 28 / 43
Il pacchetto java.net Comunicazione tramite UDP
La classe DatagramSocket
La trasmissione di pacchetti UDP avviene tramite la classeDatagramSocket
Due possibili costruttori sono:
public DatagramSocket()
Per la creazione di una DatagramSocket associata ad una qualsiasiporta libera del sistemapublic DatagramSocket(int port)
Per la creazione di una DatagramSocket in ascolto sulla porta port
specificata
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 29 / 43
Il pacchetto java.net Comunicazione tramite UDP
La classe DatagramSocket: invio e ricezione
I due metodi per l’invio e la ricezione di pacchetti sono send ereceive
public void send(DatagramPacket d)
Questo metodo invia il pacchetto UDP specificato; le informazionisull’host di destinazione sono contenute nel pacchettopublic void receive(DatagramPacket d)
Questo metodo resta in ascolto di un pacchetto UDP; le informazionisul numero massimo di byte da ricevere sono, di nuovo, contenute nelpacchetto
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 30 / 43
Il pacchetto java.net Comunicazione tramite UDP
La classe DatagramSocket: altri metodi
Altri metodi offerti dalla classe DatagramSocket sono:
public void connect(InetAddress address, int port)
Associa la socket ad un indirizzo ed una porta imponendo che ipacchetti possano essere inviati e ricevuti solo da tale host. Non
effettua una connessione nel vero senso del termine
public void disconnect()
Annulla l’effetto di una precedente operazione connect
public void setSoTimeout(int time)
Specifica un tempo di timeout per l’operazione di ricezione
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 31 / 43
Il pacchetto java.net Comunicazione tramite UDP
Esempio: invio di pacchetti UDP
Vediamo un esempio di codice per l’invio di un pacchetto UDP:
DatagramPacket dp;
byte[] msg = "Messaggio di prova".getBytes();
dp = new DatagramPacket(msg, msg.length, ip, port);
DatagramSocket ds = new DatagramSocket();
ds.send(dp);
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 32 / 43
Il pacchetto java.net Comunicazione tramite UDP
Esempio: ricezione di pacchetti UDP
Vediamo il corrispondente codice per la ricezione di pacchetti UDP:
DatagramSocket ds = new DatagramSocket(port);
byte[] in = new byte[1024];
DatagramPacket dp = new DatagramPacket(in, 1024);
ds.receive(dp);
System.out.print("Received: ");
System.out.println(
new String(dp.getData(), 0, dp.getLength()));
La stampa dei dati ricevuti come stringa ha senso in quest’esempio inquanto sappiamo che i dati inviati rappresentano, appunto, unastringa
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 33 / 43
Il pacchetto java.net Comunicazione tramite UDP
Problematiche di UDP
Notare che a causa della sua semplicita UDP ci offre meno controllosul flusso di dati, e spesso puo essere necessario adottare delletecniche o dei presupposti a livello applicazione per garantire ilfunzionamento. Due problematiche per esempio sono le seguenti
Non possiamo sapere direttamente tramite il protocollo se undeterminato pacchetto e stato ricevuto. L’invio ad un host inesistenteo ad una porta errata non produce alcuna situazione di errore
Nel caso il pacchetto inviato fosse stato di dimensione superiore alladimensione specificata (nell’esempio 1024 byte) i byte in eccessosarebbero andati persi. Di nuovo, nessuna situazione di erroreverrebbe segnalata
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 34 / 43
Il pacchetto java.net Uso di URL e del protocollo HTTP
Concetto di URL
Un URL (Uniform Resource Locator) e un’identificatore di una risorsanel web; la sua sintassi e
protocollo://host[:porta][percorso][file][?query][#pos]
Alcuni esempi di URL:
http://www.google.it:80/search?q=urlhttp://www.unifi.it/notizie/news/#archivihttp://www.dsmi.unisi.it/newsito/index.php
Gli URL vengono utilizzati per la comunicazione tramite protocolli adalto livello come http o ftp.
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 35 / 43
Il pacchetto java.net Uso di URL e del protocollo HTTP
Campi di un URL
I campi dell’URL specificano varie caratteristiche della risorsarappresentata:
protocollo E’ il protocollo da utilizzare per effettuare la richiesta (es. http, ftp,file)
host Il nome dell’host remoto, anche come indirizzo IP (es. www.google.it o72.14.221.104)
porta La porta sul quale connettersi; per http il valore di default e la porta 80percorso Il percorso sul quale si trova la risorsa sul server
file Il file corrispondente alla risorsa sul serverquery Rappresenta una serie di parametri da passare insieme alla richiesta
sec Indica un riferimento ad un determinato punto del documento
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 36 / 43
Il pacchetto java.net Uso di URL e del protocollo HTTP
La classe URL
La classe URL rappresenta un Uniform Resource Locator
Puo essere costruita tramite la rappresentazione dell’URL comestringa:
URL(String url)
Come per i file, e possibile specificare degli URL relativi ad un URL dipartenza
URL(URL context, String url)
Per esempio se si combina l’URL padrehttp://www.mat.unisi.it/newsito/index.php con l’URL relativaricerca.php si ottiene l’URLhttp://www.mat.unisi.it/newsito/ricerca.php
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 37 / 43
Il pacchetto java.net Uso di URL e del protocollo HTTP
La classe URL
A disposizione nella classe URL vari metodi per estrarre i suoi campi:
getProtocol(), getHost(), getPort(), getFile(),
getPath(), getRef(), getQuery()
Al momento della sua creazione un oggetto URL non ha ancoraeffettuato nessuna operazione di connessione remota
La connessione avviene tramite il metodo
public URLConnection openConnection()
L’oggetto URLConnection restituito rappresenta, appunto, unaconnessione ad un URLA seconda del protocollo verra restituito un certo sottotipo diURLConnection; nel caso di http si otterra una HttpURLConnection
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 38 / 43
Il pacchetto java.net Uso di URL e del protocollo HTTP
La classe URLConnection
Una volta ottenuta da classe URLConnection connessa si puo dareinizio ad una comunicazione ottenendo gli stream in ingresso ed inuscita tramite i metodi getInputStream() e getOutputStream()
Esistono vari metodi per interrogare le proprieta dell’oggetto riferito:
getContentLength(), getContentType(), getExpiration(),
getHeaderField(String name)
Per impostare i vari campi della richiesta da inviare si puo usare ilmetodo
setRequestProperty(String key, String property)
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 39 / 43
Il pacchetto java.net Uso di URL e del protocollo HTTP
La classe URLConnection
Dalla JDK 1.5, e possibile utilizzare inoltre i seguenti metodi permanipolare il timeout in fase di lettura:
setReadTimeout(int timeout), getReadTimeout()
Se non ci interessa utilizzare le funzionalita della classeURLConnection ma vogliamo solo l’InputStream associato perottenere il contenuto dell’URL, possiamo ottenere quest’oggettodirettamente tramite il metodo di URL openStream()
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 40 / 43
Il pacchetto java.net Uso di URL e del protocollo HTTP
Esempio: download di una pagina HTML
Il seguente codice scarica una pagina web e la salva come un file locale
URL source = new URL("http://java.sun.com");
InputStream in = new BufferedInputStream(
source.openStream());
OutputStream out = new BufferedOutputStream(
new FileOutputStream(dest));
int readbyte = in.read();
while (readbyte >= 0) {
out.write(readbyte);
readbyte = in.read();
}
in.close();
out.close();
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 41 / 43
Il pacchetto java.net Uso di URL e del protocollo HTTP
La classe HttpURLConnection
Nel caso di un URL che utilizza il protocollo HTTP si puo usufruiredelle funzionalita aggiuntive che questa offre rispetto alla classeURLConnection
Il metodo getResponseCode() restituisce il codice di ritorno HTTP.I vari codici sono contenuti come campi statici nella classe. Alcuni diessi sono:
200 Ok3xx Redirezione ad un’altra pagina403 Accesso proibito404 Non trovato
Il metodo setFollowRedirects(boolean fr) serve per indicare sele redirezioni ad un’altra pagina indicate nella risposta vadano seguiteautomaticamente o meno
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 42 / 43
Il pacchetto java.net Esercizio (2)
Esercizio (2)
Realizzare un programma che scarichi su disco una serie di file dalweb tramite protocollo HTTP
L’elenco dei file da scaricare viene letto da un file di testo contenenteun elenco di URL
Per massimizzare la banda utilizzata ed ottimizzare i tempi eseguire ildownload dei vari file con piu thread che agiscono in parallelo
Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 43 / 43