Laboratorio di reti I: Il pacchetto java.net

annuncio pubblicitario
Laboratorio di reti I: Il pacchetto java.net
Stefano Brocchi
[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 può essere modellata con una serie di strati dove ognuno
rappresenta 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 modo
passare per ogni livello prima di essere passate al livello successivo
Le implementazioni dei vari livelli dovrebbero essere indipendenti tra
di loro
Nelle reti reali non sempre queste direttive vengono seguite
rigidamente
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:
HTTP
SMTP
FTP
TCP
UDP
IP
Il protocollo IP (Internet Protocol) corrisponde al livello di rete del
modello osi; per lo smistamento dei pacchetti ad ogni host viene
assegnato 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 come
numeri da 0 a 255
Es. 72.14.221.104
Il nuovo protocollo IPv6 in via di introduzione identificherà una
macchina 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 può essere identificato per comodità tramite una stringa (es.
www.google.it). Per ottenere l’indirizzo (o uno degli indirizzi) ad esso
associato 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 è quello client-server : un host
detto client richiede un servizio ad un altro detto server che computa
un risultato e lo manda in risposta al client
L’esempio più semplice è la richiesta di una pagina web
Altri possibili paradigmi sono:
Remote evaluation: un host manda del codice ad un altro richiedendo
che questo venga eseguito
Code on demand: un host richiede il codice per eseguire una
determinata 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 essere
ottenuti tramite i seguenti metodi statici
InetAddress getLocalHost()
Restituisce l’indirizzo dell’host locale
InetAddress getByAddress(byte[] addr)
Restituisce l’indirizzo rappresentato dai byte passati
InetAddress 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 informazioni
sull’indirizzo rappresentato tra cui
String getHostAddress()
Restituisce l’indirizzo IP dell’host locale in forma di stringa
byte[] getAddress()
Restituisce l’indirizzo IP dell’host locale in forma di vettore di byte
String getHostName()
Restituisce il nome dell’indirizzo rappresentato
Gli oggetti InetAddress potranno inoltre essere utilizzati come
parametri 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 funzionalità tra cui
Garanzia di consegna: se un pacchetto non arriva a destinazione questo
viene rilevato automaticamente tramite un sistema di acknowledgement
e timeout e questo viene ritrasmesso finchè non raggiunge il mittente
Ordinamento dei pacchetti: nel caso in cui i pacchetti arrivino al
destinatario in ordine diverso da quello di invio il protocollo esegue un
riordinamento; in questo modo la lettura e scrittura su di un canale
risulta sequenziale come sugli altri stream di dati
Grazie a tali garanzie, a livello applicazione possiamo evitare di
preoccuparci 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 è un’astrazione per un’estremo di una comunicazione
TCP/IP
I dati per la creazione di una socket sono l’indirizzo IP dell’host con il
quale si vuole comunicare e una porta di comunicazione
Una porta è un intero da 1 a 65.535 (216 − 1) che verrà utilizzato in
fase di comunicazione per distinguere le varie connessioni
Le porte tra 1 e 1023 sono considerate riservate per applicazioni e
protocolli ’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 creata
tramite i seguenti passi:
Un server resta in attesa di connessioni su una determinata porta
Un client richiede una connessione al server sulla porta corrispondente
Il server accetta la connessione dando inizio alla comunicazione
Quando un server accetta una connessione da un client la
comunicazione viene rediretta su di un’altra porta del server in modo
che questo possa rimettersi in ascolto per altre connessioni sulla
stessa 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 e
ServerSocket
La classe ServerSocket serve per permettere ad un server di
rimanere in attesa di una connessione
Vediamo innanzitutto un esempio di funzionamento delle classi;
vedremo tutti i loro metodi in dettaglio più 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 attendere
connessioni in ingresso:
ServerSocket ss = new ServerSocket(port);
Socket s = ss.accept();
Al momento della creazione viene specificata la porta su cui stare in
attesa; con l’istruzione accept() il server resta in ascolto
Dal momento in cui un client si connette, al server viene restituito un
oggetto 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’oggetto
ipAddress deve essere l’InetAddress corrispondente al server;
l’intero port deve essere la porta sulla quale il server è in ascolto
Dalla JDK 1.4, si può ottenere alternativamente una socket connessa
in 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 è connessa, sia essa lato client o lato server
(ottenuta dal metodo accept()) da essa devono venire estratti gli
stream per la comunicazione
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
A questo punto la comunicazione può avvenire tramite le solite
tecniche di gestione degli stream
Alla terminazione della comunicazione sarà necessario chiudere la
socket
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 attende
connessioni su di una determinata porta e stampa su schermo i dati
che 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 appena
descritto questo codice potrebbe essere usato per la stampa di
messaggi 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 può succedere che alcuni host non
rispondano per un tempo indefinitamente lungo; in questi casi
un’istruzione di lettura bloccherebbe il programma
Per risolvere questo problema si può impostare un valore detto di
timeout: se dopo una certa quantità di tempo l’istruzione di IO non è
terminata, questa viene interrotta e viene generata una
SocketTimeoutException
Il timeout di una socket può essere impostato tramite il metodo
setSoTimeout(int timeout); si può impostare il timeout anche in
una server socket con l’omonimo metodo per evitare che una
accept() 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 una
socket connessa all’indirizzo address sulla porta port
getInputStream(), getOutputStream() per ottenere gli stream in
ingresso 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 dalla
JDK1.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 è ancora connessa
Esistono vari metodi per l’interrogazione di proprietà del socket, tra
cui getPort(), getLocalPort(), getInetAddress(),
getLocalAddress(), getSoTimeout() ...
Quasi tutti i metodi di Socket lanciano eccezioni derivate da
IOException in caso di varie situazioni di errore (per es. host non
trovato 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 una
ServerSocket associata ad una determinata porta
Socket accept() per stare in ascolto ed ottenere una la Socket di
un 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 dovrà stare
in ascolto e mandare un determinato file ai client che ne fanno
richiesta. Questi salveranno il file in locale.
Evitare eventuali situazioni di blocco causate da una mancata risposta
tramite l’uso di timeout
Progettare o realizzare le seguenti funzionalità:
Rendere possibile la gestione contemporanea di più client da parte del
server in modo da fornire un servizio continuo. Questo si può ottenere
creando al momento del collegamento un thread per la gestione di ogni
client e rimettendo il server immediatamente in ascolto
Mandare ai client un qualsiasi file richiesto presente sul server (o nella
cartella di lavoro). In questo caso al momento della connessione il
server dovrà aspettare che il client mandi la sua richiesta per poi
rispondere 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 è orientato alla connessione: tra due host non si crea uno
stream stabile
L’avvio di una comunicazione avviene senza handshaking
La consegna dei pacchetti non è garantita; al contrario i controlli
sull’integrità vengono eseguiti come in TCP
L’ordine di arrivo dei pacchetti non è necessariamente lo stesso di invio
La comunicazione è perlopiù 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 è che grazie alla sua semplicità
offre un servizio molto rapido. In particolare:
Una comunicazione può iniziare molto rapidamente grazie all’assenza
di handshaking (per questo viene spesso utilizzato per DNS)
Richiede una minore occupazione di banda, soprattutto nella gestione
di pacchetti piccoli, grazie ad un’intestazione molto breve
La banda occupata è minimale grazie anche all’assenza di servizi per
l’ordinamento dei pacchetti o per la gestione della congestione di rete
forniti 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 può 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 pacchetti
diverso 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 del
pacchetto e length il numero di byte da leggere, e costruttori per
l’invio come
public DatagramPacket(byte[] buf, int length,
InetAddress address, int port)
... dove vengono specificati indirizzo e porta di destinazione, oltre al
numero length di byte da inviare
Esistono altri costruttori che permettono anche di specificare un
offset, cioè un punto del vettore b dove iniziano i byte da inviare o
ricevere
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 per
accedere alle informazioni contenute nel pacchetto rappresentato:
byte[] getData(), int getLength()
Utili ad ottenere il vettore di byte contenuti e la lunghezza del
pacchetto; da usare dopo la ricevione del pacchetto
InetAddress[] getAddress(), int getPort()
Da usare per ottenere indirizzo e porta dell’host remoto che ha
mandato o ricevuto il pacchetto
void 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 classe
DatagramSocket
Due possibili costruttori sono:
public DatagramSocket()
Per la creazione di una DatagramSocket associata ad una qualsiasi
porta libera del sistema
public 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 e
receive
public void send(DatagramPacket d)
Questo metodo invia il pacchetto UDP specificato; le informazioni
sull’host di destinazione sono contenute nel pacchetto
public void receive(DatagramPacket d)
Questo metodo resta in ascolto di un pacchetto UDP; le informazioni
sul numero massimo di byte da ricevere sono, di nuovo, contenute nel
pacchetto
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 i
pacchetti 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 in
quanto sappiamo che i dati inviati rappresentano, appunto, una
stringa
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 semplicità UDP ci offre meno controllo
sul flusso di dati, e spesso può essere necessario adottare delle
tecniche o dei presupposti a livello applicazione per garantire il
funzionamento. Due problematiche per esempio sono le seguenti
Non possiamo sapere direttamente tramite il protocollo se un
determinato pacchetto è stato ricevuto. L’invio ad un host inesistente
o ad una porta errata non produce alcuna situazione di errore
Nel caso il pacchetto inviato fosse stato di dimensione superiore alla
dimensione specificata (nell’esempio 1024 byte) i byte in eccesso
sarebbero andati persi. Di nuovo, nessuna situazione di errore
verrebbe 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) è un’identificatore di una risorsa
nel web; la sua sintassi è
protocollo://host[:porta][percorso][file][?query][#pos]
Alcuni esempi di URL:
http://www.google.it:80/search?q=url
http://www.unifi.it/notizie/news/#archivi
http://www.dsmi.unisi.it/newsito/index.php
Gli URL vengono utilizzati per la comunicazione tramite protocolli ad
alto 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 risorsa
rappresentata:
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 o
72.14.221.104)
porta La porta sul quale connettersi; per http il valore di default è la porta 80
percorso Il percorso sul quale si trova la risorsa sul server
file Il file corrispondente alla risorsa sul server
query 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
Può essere costruita tramite la rappresentazione dell’URL come
stringa:
URL(String url)
Come per i file, è possibile specificare degli URL relativi ad un URL di
partenza
URL(URL context, String url)
Per esempio se si combina l’URL padre
http://www.mat.unisi.it/newsito/index.php con l’URL relativa
ricerca.php si ottiene l’URL
http://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 ancora
effettuato nessuna operazione di connessione remota
La connessione avviene tramite il metodo
public URLConnection openConnection()
L’oggetto URLConnection restituito rappresenta, appunto, una
connessione ad un URL
A seconda del protocollo verrà restituito un certo sottotipo di
URLConnection; nel caso di http si otterrà 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 può dare
inizio ad una comunicazione ottenendo gli stream in ingresso ed in
uscita tramite i metodi getInputStream() e getOutputStream()
Esistono vari metodi per interrogare le proprietà dell’oggetto riferito:
getContentLength(), getContentType(), getExpiration(),
getHeaderField(String name)
Per impostare i vari campi della richiesta da inviare si può usare il
metodo
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, è possibile utilizzare inoltre i seguenti metodi per
manipolare il timeout in fase di lettura:
setReadTimeout(int timeout), getReadTimeout()
Se non ci interessa utilizzare le funzionalità della classe
URLConnection ma vogliamo solo l’InputStream associato per
ottenere il contenuto dell’URL, possiamo ottenere quest’oggetto
direttamente 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 può usufruire
delle funzionalità aggiuntive che questa offre rispetto alla classe
URLConnection
Il metodo getResponseCode() restituisce il codice di ritorno HTTP.
I vari codici sono contenuti come campi statici nella classe. Alcuni di
essi sono:
200
3xx
403
404
Ok
Redirezione ad un’altra pagina
Accesso proibito
Non trovato
Il metodo setFollowRedirects(boolean fr) serve per indicare se
le redirezioni ad un’altra pagina indicate nella risposta vadano seguite
automaticamente 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 dal
web tramite protocollo HTTP
L’elenco dei file da scaricare viene letto da un file di testo contenente
un elenco di URL
Per massimizzare la banda utilizzata ed ottimizzare i tempi eseguire il
download dei vari file con più thread che agiscono in parallelo
Stefano Brocchi
Laboratorio di reti I: Il pacchetto java.net
5 novembre, 2008
43 / 43
Scarica