43
Laboratorio di reti I: Il pacchetto java.net Stefano Brocchi [email protected]fi.it 5 novembre, 2008 Stefano Brocchi Laboratorio di reti I: Il pacchetto java.net 5 novembre, 2008 1 / 43

Laboratorio di reti I: Il pacchetto java - The BCIF lossless image … · 2016-02-06 · Modello a strati di una rete ... Applicazione Presentazione Sessione Trasporto Rete Data Link

  • Upload
    doanque

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

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