Corso di Reti di Calcolatori. java.net.url



Documenti analoghi
Università degli Studi di Modena e Reggio Emilia. Facoltà di Ingegneria Reggio Emilia CORSO DI TECNOLOGIE E APPLICAZIONI WEB. Http con java, URL

Tecnologie Web L-A. Java e HTTP. Dario Bottazzi Tel , dario.bottazzi@unibo.it, SkypeID: dariobottazzi. Java e TCP/IP in a Nutshell

Architettura Client-Server

ProgettAzione tecnologie in movimento - V anno Unità 4 - Realizzare applicazioni per la comunicazione in rete

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

Cifratura simmetrica

Operazioni di input/output. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Chat. Si ha un server in ascolto sulla porta Quando un client richiede la connessione, il server risponde con: Connessione accettata.

Corso sul linguaggio Java

Parte II: Reti di calcolatori Lezione 10

Flussi, lettori e scrittori

Corso di Reti di Calcolatori L-A

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Corso di Reti di Calcolatori

Corso di Reti di Calcolatori. Datagrammi

20 - Input/Output su File

Programmazione distribuita in Java. Socket & Client-Server

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Applicazioni web. Parte 5 Socket

Algoritmi di Ricerca. Esempi di programmi Java

Socket & RMI Ingegneria del Software - San Pietro

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

appunti delle lezioni Architetture client/server: applicazioni client

Laboratorio di reti I: Il pacchetto java.net

Corsi di Reti di Calcolatori (Docente Luca Becchetti)

Esercitazione sulle libpq - libreria C per PostgreSQL

Datagrammi. NOTA: MulticastSocket estende DatagramSocket

Altri tipi di connessione

Architettura MVC-2: i JavaBeans

Il Protocollo HTTP e la programmazione di estensioni Web

Input/Output in Java

2.5. L'indirizzo IP identifica il computer di origine, il numero di porta invece identifica il processo di origine.

Connessioni di rete. Progetto di reti di Calcolatori e Sistemi Informatici - Stefano Millozzi. PdR_ Stefano Millozzi

Programmare con le Socket TCP in java. 2: Application Layer 1

Programmare con le Socket

Programmazione dei socket con TCP #2

Protocolli applicativi: FTP

MagiCum S.r.l. Progetto Inno-School

CORSO DI ALGORITMI E PROGRAMMAZIONE. JDBC Java DataBase Connectivity

Programmare con le Socket TCP

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Lezione 5: Socket SSL/ TLS. Corso di Programmazione in Rete Laurea Magistrale in Ing. Informatica Università degli Studi di Salerno

Basic Network Tutorial

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Gestione delle Eccezioni

PROGRAMMARE IN JAVA VOLUME II

Client e Server comunicano tramite il protocollo SOAP.

Note pratiche sullo sviluppo di servlet (I)

Introduzione JDBC interfaccia java.sql driver caricare i driver

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni client

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Esercitazione su JDBC

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Non si deve fare ALCUN riferimento alla parte specifica di JDBC.

Sincronizzazione con Java

Il linguaggio Java I file sequenziali

I file di dati. Unità didattica D1 1

GERARCHIE RICORSIVE - SQL SERVER 2008

Che cos'è un modulo? pulsanti di opzione caselle di controllo caselle di riepilogo

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Corso Eclipse. Prerequisiti. 1 Introduzione

Basi di dati e Web (Moduli: Laboratorio e Siti Web centrati sui Dati) Prova scritta del 14 luglio 2008

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

SAPIENZA Università di Roma, Facoltà di Ingegneria

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

Introduzione alla programmazione Http lato server in Java

Arduino Quick Ethernet library Reference

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Laboratorio Progettazione Web PHP e FORMs HTML. Andrea Marchetti IIT-CNR andrea.marchetti@iit.cnr.ita 2013/2014

Introduzione alla programmazione in C

RMI. Java RMI RMI. G. Prencipe

La struttura dati ad albero binario

Come trattare il risultato di un comando SQL (relazioni) che

Tabelle di riferimento Pulsanti Inserire documento Predisposizione doc Approvazione Doc Numerazione Doc Pubblicazione Albo Webservice

Telematica II 12. Esercitazione/Laboratorio 4

Operazioni di scrittura e lettura con periferici in linguaggio Java

Tener traccia del client

LAVORI ESTIVI DI INFORMATICA PER LA CLASSE IV Sez. Ainf (Prof. Tessore Luca)

Corso sul linguaggio Java

HTTP adaptation layer per generico protocollo di scambio dati

10 - Programmare con gli Array

Prova d Esame Compito A

Reti di Calcolatori:

Alarms Android Mobile Programming Prof. R. De Prisco

Servlet e JDBC. Servlet e Web Server. Servlet e Web Server. Servlet e Web Server. Richieste. Servlet. Servlet:

TFA 42 Sistemi e Reti di Calcolatori per la Didattica

Prova d Esame Compito B

Java: la libreria delle classi

Transcript:

Corso di Reti di Calcolatori UNICAL Facoltà di Ingegneria a.a. 2002/2003 Esercitazione sul networking in Java (2 a parte) paolo.trunfio@deis.unical.it 1 java.net.url URL (String spec) crea un oggetto URL a partire dalla stringa che lo rappresenta URL (String protocol, String host, int port, String file) crea un URL a partire dai componenti specificati (port = -1 indica l uso della porta standard per il protocollo specificato) URLConnection openconnection() restituisce un oggetto URLConnection che gestisce la connessione diretta alla risorsa InputStream openstream() apre un flusso di input per la lettura dei dati della risorsa 2

Recupero del contenuto di un sito Web import java.io.*; import java.net.*; public class URLTest { public static void main(string[] args) { try { URL url = new URL("http://www.deis.unical.it"); BufferedReader in = new BufferedReader (new InputStreamReader(url.openStream())); boolean more = true; while (more) { String line = in.readline(); if (line == null) more = false; else System.out.println(line); catch (IOException e) { System.out.println("Error"+e); 3 java.net.urlconnection (1) Per ottenere dalla risorsa informazioni aggiuntive e controllarne meglio l accesso si usa la classe URLConnection. In generale per creare una URLConnection si seguono i seguenti passi: 1.Si chiama il metodo openconnection di un oggetto URL: URLConnection connection = url.openconnection(); 2.Si impostano le proprietà usando i metodi: setdoinput setdooutput setifmodifiedsince setusecaches setallowuserinteraction setrequestproperty 3.Si effettua la connessione alla risorsa remota mediante il metodo connect: connection.connect(); Il metodo connect crea una connessione socket con il server e richiede al server le informazioni di intestazione. 4

java.net.urlconnection (2) 4.Dopo aver attivato la connessione è possibile richiedere le informazioni di intestazione. I metodi getheaderfieldkey e getheaderfield consentono di accedere a tutti i campi di intestazione. I seguenti metodi interrogano i campi standard: getcontenttype getcontentlength getcontentencoding getdate getexpiration getlastmodified 5.Si accede alla risorsa remota, utilizzando il metodo getinputstream per ottenere un flusso di input per leggere le informazioni, ed il metodo getoutputstream per ottenere un flusso di output per inviare informazioni. 5 java.net.urlconnection (3) void setdoinput(boolean doinput) se doinput è true, l utente può ricevere l input da questo URLConnection void setdooutput(boolean dooutput) se dooutput è true, l utente può ricevere l output da questo URLConnection void setifmodifiedsince(long time) configura questo URLConnection per recuperare solo i dati che sono stati modificati dopo la data indicata void setusecaches(boolean usecaches) se usecaches è true, i dati possono essere recuperati da una cache locale void setallowuserinteraction(boolean allowuserinteraction) se allowuserinteraction è true, all utente può essere richiesta una password void setrequestproperty(string key, String value) imposta una proprietà della richiesta 6

java.net.urlconnection (4) void connect() si connette alla risorsa remota e recupera le informazioni di intestazione String getcontenttype() recupera il tipo di contenuto, per esempio text/plain o image/gif int getcontentlength() recupera la lunghezza del contenuto, oppure 1 se il valore è sconosciuto String getcontentencoding() recupera la codifica del contenuto, per esempio gzip long getdate() recupera la data di creazione della risorsa long getexpiration() recupera la data di scadenza della risorsa long getlastmodified() recupera la data dell ultima modifica della risorsa 7 java.net.urlconnection (5) String getheaderfieldkey(int n) recupera l n-esima chiave del campo di intestazione String getheaderfield(n) recupera l n-esimo valore del campo di intestazione InputStream getinputstream() restituisce uno stream per leggere la risorsa OutputStream getoutputstream() restituisce uno stream per scrivere sulla risorsa 8

URLConnectionTest (1) import java.io.*; import java.net.*; import java.util.*; public class URLConnectionTest { public static void main(string[] args) { try { URL url = new URL("http://java.sun.com"); URLConnection connection = url.openconnection(); connection.connect(); // print header fields int n = 1; String key; while ((key = connection.getheaderfieldkey(n))!= null) { String value = connection.getheaderfield(n); System.out.println(key + ": " + value); n++; // print convenience functions System.out.println("----------"); System.out.println("getContentType: "+connection.getcontenttype()); 9 URLConnectionTest (2) System.out.println("getContentLength: "+connection.getcontentlength()); System.out.println("getContentEncoding: " +connection.getcontentencoding()); System.out.println("getDate: "+connection.getdate()); System.out.println("getExpiration: "+connection.getexpiration()); System.out.println("getLastModifed: "+connection.getlastmodified()); System.out.println("----------"); BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); // print first ten lines of contents String line; n = 1; while ((line = in.readline())!= null && n <= 10) { System.out.println(line); n++; if (line!= null) System.out.println("..."); catch (IOException exception) {System.out.println("Error: " + exception); 10

URLConnectionTest (3) L output del programma è il seguente: Server: Netscape-Enterprise/6.0 Date: Sat, 12 Oct 2002 23:15:45 GMT Content-type: text/html Connection: close ---------- getcontenttype: text/html getcontentlength: -1 getcontentencoding: null getdate: 1034453745000 getexpiration: 0 getlastmodifed: 0 ---------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <TITLE>The Source for Java(TM) Technology</TITLE>... 11 Invio di dati ad un server Web (1) Per inviare informazioni ad un server Web sono disponibili due metodi: GET e POST Con il metodo GET i parametri si allegano alla fine dell indirizzo URL: http://host/procedura?name1=value1&name2=value2 I parametri sono separati tra loro da una &, e devono essere codificati secondo la specifica URL nel modo seguente: i caratteri alfanumerici ed i caratteri - _. * non vengono modificati, mentre gli spazi vengono sostituiti dal carattere + e tutti gli altri sono rappresentati nel formato %UV dove 0xUV è il byte di ordine minore del carattere. Esiste una classe java.net.urlencoder che offre due metodi: static String encode (String s) restituisce la forma codificata secondo la specifica URL della stringa s static String decode (String s) restituisce la stringa s decodificata 12

Invio di dati ad un server Web (2) Con il metodo GET si possono includere solo un numero limitato di caratteri. Il metodo POST non utilizza parametri, ma recupera un flusso di output da URLConnection e scrive le coppie nome/valore su questo flusso. Il processo per inviare dati ad una procedura con POST è il seguente: // si stabilisce una URLConnection URL url = new URL ( http://host/procedura ); URLConnection connection = url.openconnection(); // si prepara la connessione all output connection.setdooutput(true); // si ottiene un flusso di output e si trasmette la sequenza di dati al server PrintWriter out = new PrintWriter(connection.getOutputStream()); out.println(name1+ = +URLEncoder.encode(value1)+ & ); out.println(name2+ = +URLEncoder.encode(value2)+ \n ); out.close(); 13 Invio di dati ad un server Web (3) Quindi la risposta del server viene letta nel solito modo: BufferedReader in = new BufferedReader (new InputStreamReader (connection.getinputstream())); String line; while ((line = in.readline())!= null) { elabora riga 14

PostTest (1) La pagina Web http://www.census.gov/ipc/www/idbprint.html contiene un modulo per richiedere dati sulla popolazione dei diversi paesi: <form method=post action="/cgi-bin/ipc/idbsprd"> <select name="tbl" size=8 > <option value="001">001 Total Midyear Population <option value="002">002 Urban Population as a Percent of Total Population </select> </form> La procedura eseguita quando si preme invio è /cgi-bin/ipc/idbsprd, ed è necessario usare il metodo POST per inviare dati alla procedura. Il componente dell interfaccia che consente di scegliere l opzione desiderata si chiama tbl. Scegliendo l opzione 001 si ottiene la tabella sulla popolazione totale a metà anno. 15 PostTest (2) La pagina consente di impostare altri campi: cty, il cui valore indica il paese di cui si vogliono ottenere i dati opyr, il cui valore indica l intervallo temporale prescelto (si usa il valore latest checked per ottenere i dati più recenti) Per recuperare i dati più recenti relativi alla popolazione della Cina si costruisce la stringa: tbl=1&cty=ch&optyr=latest+checked si invia la stringa all indirizzo URL: http://www.census.gob/cgi-bin/ipc/idbsprd quindi si recupera l output. Il programma seguente invia i dati via POST ad un URL arbitrario. I dati sono specificati nel file di proprietà PostTest.properties. 16

PostTest (3) import java.io.*; import java.net.*; import java.util.*; public class PostTest { public static void main(string[] args) { try { String filename = "PostTest.properties"; Properties props = new Properties(); FileInputStream in = new FileInputStream(fileName); props.load(in); URL url = new URL(props.getProperty("URL")); props.remove("url"); String r = dopost(url, props); System.out.println(r); catch (IOException exception) {System.out.println("Error: " + exception); public static String dopost(url url, Properties namevaluepairs) throws IOException { URLConnection connection = url.openconnection(); connection.setdooutput(true); 17 PostTest (4) PrintWriter out = new PrintWriter(connection.getOutputStream()); Enumeration enum = namevaluepairs.keys(); while (enum.hasmoreelements()) { String name = (String)enum.nextElement(); String value = namevaluepairs.getproperty(name); char ch; if (enum.hasmoreelements()) ch = '&'; else ch = '\n'; out.print(name + "="+URLEncoder.encode(value) + ch); out.close(); BufferedReader in; try { in = new BufferedReader (new InputStreamReader(connection.getInputStream())); 18

PostTest (5) catch (FileNotFoundException exception) { InputStream err = ((HttpURLConnection)connection).getErrorStream(); if (err == null) throw exception; in = new BufferedReader(new InputStreamReader(err)); StringBuffer response = new StringBuffer(); String line; while ((line = in.readline())!= null) response.append(line + "\n"); in.close(); return response.tostring(); 19 PostTest (6) Contenuto del file PostTest.properties: URL=http://www.census.gov/cgi-bin/ipc/idbsprd tbl=001 cty=ch optyr=latest checked 20

PostTest (7) L output del programma è il seguente: <PRE> U.S. Bureau of the Census, International Data Base Table 001. Total Midyear Population -------------------------- CtYear Population -------------------------- CH2002 1279160885 -------------------------- Source: U.S. Bureau of the Census, International Data Base. </PRE> 21 Bibliografia Cay S. Horstmann, Gary Cornell Java 2 Volume II Tecniche avanzate Quarta Edizione McGraw-Hill Capitolo 3: Comunicazione di Rete The Java Tutorial: http://java.sun.com/docs/books/tutorial/networking 22