CRS4 - http://www.crs4.it java.net.* Basic Network Tutorial maggio 2004 Stefano Sanna - [email protected] Agenda CRS4 - http://www.crs4.it ● ● Java e network programming Low-level programming, network programming e distributed computing ● UDP e TCP ● Client e Server ● Applicazioni ● XML-RPC ● Bibliografia ● Conclusioni Stefano Sanna - [email protected] CRS4 - http://www.crs4.it Java Stefano Sanna - [email protected] CRS4 - http://www.crs4.it Protocol stack Applicazione (HTTP, FTP...) Applicazione (HTTP, FTP...) Trasporto (UDP, FTP, RTP) Trasporto (UDP, FTP, RTP) Rete (IP) Rete (IP) Hardware Hardware Stefano Sanna - [email protected] Protocolli di rete CRS4 - http://www.crs4.it ● ● E' importante conoscere i diversi protocolli a disposizione: i limiti, le potenzialità, l'affidabilità, la robustezza, l'overhead introdotto, la sicurezza, i requisiti di memoria e calcolo La scelta del protocollo giusto deve essere fatta in base a: – banda della rete – affidabilità della rete (wired/wireless) – volume dei dati scambiati – ... Stefano Sanna - [email protected] Tre livelli di sviluppo CRS4 - http://www.crs4.it ● L'evoluzione dei protocolli e delle infrastrutture di rete ha portato “idealmente” a tre livelli distinti di programmazione e sviluppo networkoriented: – Low-level Network Programming – Network Programming – Distributed Computing Stefano Sanna - [email protected] Low-level network programming CRS4 - http://www.crs4.it ● ● ● Per low-level network programming intendiamo la possibilità di scambiare dati primitivi e complessi attraverso stream su trasporto TCP e UDP. Attraverso le classi Socket e ServerSocket è possibile gestire la comunicazione client/server per l'invio di byte[], tipi base, oggetti serializzati La logica di comunicazione è responsabilità del programmatore che dovrà prevedere opportuni codici di controllo Stefano Sanna - [email protected] Network Programming CRS4 - http://www.crs4.it ● ● ● Per network programming intendiamo l'utilizzo di uno o più protocolli applicativi, che si occupano di gestire la logica di comunicazione tra client e server A seconda del protocollo scelto, il programmatore dispone di strumenti più o meno complessi che nascondono i dettagli implementativi della specifica Esempi di protocolli applicativi: Telnet, FTP, HTTP, SSH, NFS, NTP... Stefano Sanna - [email protected] Distributed Computing CRS4 - http://www.crs4.it ● ● Il distributed computing rappresenta la possibilità di delocalizzare l'elaborazione sui nodi di una rete in modo trasparente per il programmatore ed il codice applicativo Attraverso opportuni meccanisimi di binding, lookup e serializzazione di oggetti, l'invocazione di metodi e l'accesso a funzioni remote avviene come se risorse fossero locali: la presenza della rete è totalmente mascherata dalle librerie applicative Stefano Sanna - [email protected] Distributed Computing CRS4 - http://www.crs4.it ● Esempi di distributed computing sono: – Java RMI: permette l'invocazione remota di metodi in maniera trasparente per il programmatore. Oggetti locali e remoti sono trattati allo stesso modo – CORBA: permette l'interoperabilità tra componenti software scritti in linguaggi diversi – Web Service: usano l'invocazione remota di metodi attraverso scambio di documenti XML su protocollo HTTP ● XML-RPC ● SOAP Stefano Sanna - [email protected] Stream model CRS4 - http://www.crs4.it ● ● ● Il sistema di I/O di Java è basato sul modello a stream: opportuni oggetti permettono di gestire i flussi di byte in ingresso e in uscita Il modello a stream permette una gestione omogenea delle sorgenti di dati, a prescindere dal supporto fisico (file, rete, porta seriale, link Bluetooth...) Attraverso un insieme componibile di filtri (decorator) e adattatori è possibile elaborare i byte in transito Stefano Sanna - [email protected] Input/Output Stream CRS4 - http://www.crs4.it ● ● InputStream: – Gestisce i flussi di byte in ingresso – Fornisce facility di buffering elementari OutputStream: – Gestisce i flussi di byte in uscita (con buffering) DataSource Applicazione Input/Output Stream Filter 1 Filter 2 Stefano Sanna - [email protected] Filter n Data Stream CRS4 - http://www.crs4.it ● ● I tipi base quali numeri interi, numeri in virgola mobile, valori logici e stringhe (ASCII, Unicode, UTF) sono codificati con più byte (non sempre indipendenti dalla piattaforma) Al fine di rendere la trasmissione di tali dati trasparente rispetto alla effettiva codifica (si pensi alla variabilità del numero di bit di un valore numerico intero) si utilizzano i DataStream, che offrono i metodi per leggere/scrivere int, short, long, float, double... Stefano Sanna - [email protected] Gestione caratteri: reader CRS4 - http://www.crs4.it ● ● L'introduzione di specifiche quali Unicode (1.0 e 2.0) e UTF-8 ha portato alla necessità di trattare in maniera dedicata il trasferimento di stream di caratteri: non è garantita, infatti, la corrispondenza “classica” 1byte == 1char! :-( Gli stream Reader e Writer sono gli strumenti utilizzati da Java per accedere a flussi di caratteri indipendentemente dalla codifica utilizzata Stefano Sanna - [email protected] Buffering CRS4 - http://www.crs4.it ● ● Alcuni protocolli si basano su scambio sequenze di stringhe separate da CR+LF: il protocollo HTTP, ad esempio, descrivere le intestazioni (header) delle HTTP Request e Response La gestione dei flussi “per righe” può essere fatta agevolmente attraverso l'uso di classi quali il BufferedReader, che offre metodi per la lettura “line by line” Stefano Sanna - [email protected] Low-level network programming CRS4 - http://www.crs4.it ● Introduciamo ora i concetti base per lo sviluppo di applicazioni che utilizzano i protocolli di comunicazione a basso livello: – IP – UDP (Datagram Packet e Datagram Socket) – TCP (Socket e ServerSocket) Stefano Sanna - [email protected] IP CRS4 - http://www.crs4.it ● ● La libreria standard di Java offre classi per: – Selezione di una specifica interfaccia di rete sulla macchina host – Recuperare informazioni su un indirizzo Internet (Ipv4 e Ipv6) InetAddress: è la classe che incapsula un indirizzo IP. E' utilizzata dalle classi per la gestione dei protocolli UDP e TCP. Stefano Sanna - [email protected] InetAdress CRS4 - http://www.crs4.it ● Metodi principali dell'interfaccia pubblica: – InetAddress.getByName(String host) – InetAddress.getAllByName(String host) – String getHostName() – byte[] getAddress() – String getHostAddress() Stefano Sanna - [email protected] nslookup... import java.net.*; CRS4 - http://www.crs4.it public class NSLookup { public static void main(String[] args) { try { String add = InetAddress.getByName(args[0]).getHostAddress(); System.out.println("Host " + args[0] + " has IP: " + add); } catch(Exception e) { System.out.println("Error: " + args[0]); } } } Stefano Sanna - [email protected] UDP CRS4 - http://www.crs4.it ● UDP: User Datagram Protocol – Permette di inviare/ricevere pacchetti di byte (datagram) ad/da un host su una porta nota – E' un protocollo connection-less, non orientato alla connessione (in senso stretto); non è garantito l'ordine di arrivo dei pacchetti: è compito dell'applicazione marcare i dati per ricostruirne la sequenza – Non offre meccanismi di controllo sul corretto invio dei dati: lo strato applicativo deve gestire tale controllo – Protocolli applicativi basati su UDP: DNS, NFS... Stefano Sanna - [email protected] Datagram CRS4 - http://www.crs4.it ● Java offre alcune classi per la ricezione e l'invio di pacchetti UDP: – Datagram Packet: è un classe “double-face” usato come contenitore per l'invio e la ricezione dei pacchetti – Datagram Socket: è la classe responsabile dell'invio dei Datagram Packet ad un server remoto e l'ascolto su una porta UDP locale Stefano Sanna - [email protected] Datagram Packet CRS4 - http://www.crs4.it ● Pacchetti in uscita – Sono costruiti a partire da un byte[] contenente i dati da inviare: DatagramPacket(byte[] buf, int length, InetAddress address, int port) ● Pacchetti in ingresso – Sono costruiti a partire da un byte[] usato come buffer per i dati in arrivo: DatagramPacket(byte[] buf, int length) Stefano Sanna - [email protected] Datagram Packet CRS4 - http://www.crs4.it ● Metodi principali dell'interfaccia pubblica: – byte[] getData() – InetAddress getAddress() – int getLength() – int getPort() Stefano Sanna - [email protected] Datagram Socket CRS4 - http://www.crs4.it ● ● E' responsabile dell'invio e della ricezione dei Datagram Packet. Metodi principali dell'interfaccia pubblica: – DatagramSocket(int port) – int getLocalPort() – void send(DatagramPacket p) – void receive(DatagramPacket p) E' possibile assegnare staticamente un Datagram Socket ad un host remoto (ferme restando tutte le caratteristiche di UDP) Stefano Sanna - [email protected] TCP/IP CRS4 - http://www.crs4.it ● Il TCP/IP è un protocollo a livello di trasporto: – Orientato alla connessione: si stabilisce un canale virtuale tra client e server che rimane attivo sino alla chiusura della connessione o malfunzionamento della rete – Trasparente: l'implementazione si occupa di assemblare la corretta sequenza dei pacchetti in arrivo – Affidabile: in caso di pacchetti persi o corrotti, lo stack si occupa di chiedere la ritrasmissione dei pacchetti mancanti Stefano Sanna - [email protected] Socket CRS4 - http://www.crs4.it ● ● La classe Socket offre i meccanismi base per aprire una connessione TCP verso un server remoto Attraverso il modello basato su stream è possibile ricevere e inviare dati in modo trasparente rispetto alla rete fisica utilizzata e ai meccanismi di connessione di quest'ultima Stefano Sanna - [email protected] Socket CRS4 - http://www.crs4.it ● Metodi principali dell'interfaccia pubblica: – Socket(String host, int port) – InputStream getInputStream() – OutputStream getOutputStream() – int getPort() – int getLocalPort() – InetAddress getInetAddress() – InetAddress getLocalInetAddress() – void close() Stefano Sanna - [email protected] ServerSocket CRS4 - http://www.crs4.it ● ● La classe ServerSocket è utilizzata creare ed assegnare server TCP ad una porta nota Il modello di comunicazione è simmetrico: per ogni connessione, la classe ServerSocket restituisce una istanza di Socket, i cui input e output stream forniscono i canali di comunicazione verso il client remoto Stefano Sanna - [email protected] ServerSocket CRS4 - http://www.crs4.it ● Metodi principali dell'interfaccia pubblica: – ServerSocket(int port) – Socket accept(); – int getLocalPort() – InetAddress getInetAddress() – void close() Stefano Sanna - [email protected] Network games :-) CRS4 - http://www.crs4.it ● ● Il miglior modo per acquisire praticità con lo sviluppo di applicazioni network-oriented e con i protocolli più comuni è... giocarci! :-) Sistemi asincroni, multithreading, sicurezza, accesso concorrente ai dati sono problematiche comuni a molt Stefano Sanna - [email protected] Echo CRS4 - http://www.crs4.it ● ● ● Vogliamo scrivere una semplicissima applicazione che riceve una stringa attraverso Socket e la rimanda indietro. Client – Apre un socket verso il server – Invia una stringa – Legge una stringa Server – Apre un serversocket e accetta una connessione – Restituisce le stringhe ricevute Stefano Sanna - [email protected] Echo server import java.io.*; CRS4 - http://www.crs4.it import java.net.*; public class EchoServer { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(8899); Socket clientSocket = serverSocket.accept(); Reader reader = new InputStreamReader(clientSocket.getInputStream()); BufferedReader buffer = new BufferedReader(reader); PrintStream ps = new PrintStream(clientSocket.getOutputStream()); String read = ""; while ((read = buffer.readLine()) != null) { System.out.println("Ricevuto: " + read); ps.println(read); } } } Stefano Sanna - [email protected] Echo client import java.io.*; CRS4 - http://www.crs4.it import java.net.*; import java.util.Date; public class EchoClient { public static void main(String[] args) throws Exception { Socket clientSocket = new Socket("127.0.0.1", 8899); Reader reader = new InputStreamReader(clientSocket.getInputStream()); BufferedReader buffer = new BufferedReader(reader); PrintStream ps = new PrintStream(clientSocket.getOutputStream()); while (true) { ps.println(new Date(System.currentTimeMillis())); System.out.println("Tornato indietro: " + buffer.readLine()); Thread.sleep(200); } } } Stefano Sanna - [email protected] Esplorazione di un protocollo CRS4 - http://www.crs4.it ● ● I Socket costituiscono un ottimo strumento didattico per imparare a gestire protocolli di complessità crescente In un modello client/server è possibile: – Creare un server fittizio per intercettare e tracciare il formato delle chiamate effettuate da un client – Create un client fittizio che, a fronte di una richiesta “elementare” ad un server reale, intercetti e descriva nel dettaglio il formato dei dati restituiti dal server Stefano Sanna - [email protected] Cosa manda un browser? CRS4 - http://www.crs4.it ● ● Si supponga di voler esaminare il formato di una richiesta HTTP inviata da un browser al server web Sarà necessario: – Creare un serversocket (verosimilmente sulla porta 80) – Leggere i dati inviati dal client riga per riga Stefano Sanna - [email protected] HTTP Request sniffer... import java.io.*; import java.net.*; CRS4 - http://www.crs4.it public class HTTPRequestSniffer { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(80); Socket clientSocket = serverSocket.accept(); InputStream input = clientSocket.getInputStream(); BufferedReader buffer = new BufferedReader(new InputStreamReader(input)); String read = ""; int line = 0; while ((read = buffer.readLine()) != null) { System.out.println(Integer.toString(line++) + " " + read); } } catch(Exception e) { e.printStackTrace(); } } } Stefano Sanna - [email protected] HTTP Request: Mozilla GET / HTTP/1.1 CRS4 - http://www.crs4.it Host: localhost User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text /plain;q=0.8,video/xmng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1 Accept-Language: en-us, en;q=0.50 Accept-Encoding: gzip, deflate, compress;q=0.9 Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66 Keep-Alive: 300 Connection: keep-alive Stefano Sanna - [email protected] HTTP Request: Internet Explorer CRS4 - http://www.crs4.it GET / HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */* Accept-Language: it Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322) Host: localhost Connection: Keep-Alive Stefano Sanna - [email protected] Cosa invia un server web? CRS4 - http://www.crs4.it ● ● Conoscendo il formato di una richiesta elementare inviata da un browser web, possiamo preparare un client fittizio con cui tracciare la risposta restituita dal server Sarà necessario: – Create un client socket verso un server web attivo – Inviare la richiesta minima (GET / HTTP/1.x) – Leggere i dati inviati dal server riga per riga Stefano Sanna - [email protected] HTTP Response sniffer... import java.io.*; import java.net.*; public class HTTPResponseSniffer { CRS4 - http://www.crs4.it public static void main(String[] args) throws Exception { Socket clientSocket = new Socket("java.sun.com", 80); InputStream input = clientSocket.getInputStream(); BufferedReader buffer = new BufferedReader(new InputStreamReader(input)); PrintStream ps = new PrintStream(clientSocket.getOutputStream()); ps.println("GET / HTTP/1.0\n\n"); String read = ""; int line = 0; while ((read = buffer.readLine()) != null) { System.out.println(Integer.toString(line++) + " " + read); } } } Stefano Sanna - [email protected] HTTP Response di java.sun.com HTTP/1.1 200 OK CRS4 - http://www.crs4.it Server: Netscape-Enterprise/6.0 Date: Tue, 18 May 2004 12:53:33 GMT Content-type: text/html;charset=ISO-8859-1 Set-cookie: JSESSIONID=java.sun.com-987f%253A40aa074a% 253A391e72d077d4b9a;path=/;expires=Tue, 18-May-2004 13:23:31 GMT Connection: close <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Java Technology</title> <meta name="keywords" content="Java, platform" /> [...] Stefano Sanna - [email protected] Multithreading CRS4 - http://www.crs4.it ● ● ● Rispetto ad altri linguaggi (Pascal, C/C++...), Java nasce con la multiprogrammazione “in mente” La possibilità di gestire più flussi di esecuzione concorrenti in maniera nativa nel linguaggio è fondamentale per facilitare lo sviluppo di applicazioni network-oriented Il server deve gestire in modo concorrente più connessioni, delegando a ciascun thread la gestione di un client Stefano Sanna - [email protected] Multithreading CRS4 - http://www.crs4.it ● ● L'esempio di “Echo server” precedentemente illustrato... funziona una sola volta e con un solo client! E' necessario incapsulare la gestione di una singola connessione all'interno di un Thread separato Connection 1 Echo Server Connection 1 Connection 1 Stefano Sanna - [email protected] Multithreading CRS4 - http://www.crs4.it ● Un Thread gestisce la connessione: private static class Connection extends Thread { private Socket clientSocket; public Connection(Socket socket) { this.clientSocket = socket; start(); } public void run() { try { // CODICE DI LETTURA:.. } catch(Exception e) { e.printStackTrace(); } } } Stefano Sanna - [email protected] Multithreading CRS4 - http://www.crs4.it ● Il server istanzia un Thread per ogni connessione ricevuta: public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(8899); while (true) { Socket clientSocket = serverSocket.accept(); new Connection(clientSocket); } } Stefano Sanna - [email protected] Protocolli applicativi CRS4 - http://www.crs4.it ● ● L'API Java offre classi per la gestione di protocolli a livello applicativo (ad esempio HTTP), che permettono di sviluppare in modo semplice e rapido potenti applicazioni network oriented Il network programming permette di trascurare tutti i dettagli del protocollo sottostante per concentrarsi solamente sullo scambio dei contenuti Stefano Sanna - [email protected] URL e URLConnection CRS4 - http://www.crs4.it ● ● ● La classe URL rappresenta un Uniform Resource Locator, cioè un riferimento formale ad una risorsa reperibile su Internet La classe URLConnection rappresenta la connessione al servizio su cui risiede la risorsa individuata da un URL Attenzione: – URL: non più “indirizzo IP”! – URLConnection: non più Socket! Stefano Sanna - [email protected] HttpURLConnection CRS4 - http://www.crs4.it ● ● ● E' la classe che incapsula la gestione di una connessione HTTP ad un server web Nasconde tutti i dettagli del protocollo, gestendo l'invio degli header, la codifica dei dati binari e la notifica degli errori di elaborazione Si ottiene a partire da una URL valida Stefano Sanna - [email protected] HttpURLConnection CRS4 - http://www.crs4.it ● Metodi principali dell'interfaccia pubblica: – URL.openConnection() – Object getContent() – int getContentLength() – String getHeaderField(String name) – String getRequestProperty(String name) – InputStream getInputStream() – OutputStream getOutputStream() Stefano Sanna - [email protected] Distributed computing: XML-RPC CRS4 - http://www.crs4.it ● ● ● ● XML-RPC: XML Remote Procedure Call XML-RPC è una specifica sviluppata nel 1998 da UserLand Software per l'invocazione remota di metodi tra diverse versioni di Frontier XML-RPC utilizza HTTP (POST) come livello di trasporto per documenti XML XML-RPC è indipendente dal linguaggio di programmazione: supporta un set minimo di tipi disponibili su tutti i moderni linguaggi Stefano Sanna - [email protected] XML-RPC: sincrono CRS4 - http://www.crs4.it ● ● ● Essendo basato su HTTP, un server XMLRPC invia una risposta contestualmente alla connessione TCP/IP della invocazione La richiesta è bloccante, nel senso che l'operazione non è conclusa finché il server non restituisce il documento XML di output È importante interfacciare tramite XMLRPC procedure che richiedono tempi di elaborazione predicibili e non eccessivamente lunghi Stefano Sanna - [email protected] XML-RPC: stateless CRS4 - http://www.crs4.it ● ● ● L'uso di HTTP rende scorrelate due invocazioni successive ad una interfaccia XML-RPC. Né il protocollo XML-RPC né HTTP contengono meccanismi per tracciare la sequenza delle invocazioni: È compito del programmatore inserire metadati (indicatori di sessione) per conoscere la storia dell'accesso ad una certa interfaccia Stefano Sanna - [email protected] XML-RPC: invocazioni CRS4 - http://www.crs4.it ● Esempio di invocazione XML-RPC: <?xml version=”1.0”?> <methodCall> <methodName>NOME_DEL_METODO</methodName> <params> <param> <value><TIPO>VALORE</TIPO></value> </param> <param> <value><TIPO>VALORE</TIPO></value> </param> </params> </methodCall> Stefano Sanna - [email protected] XML-RPC: risposte CRS4 - http://www.crs4.it ● Esempio di risposta: <?xml version=”1.0”?> <methodResponse> <methodName>NOME_DEL_METODO</methodName> <params> <param> <value><TIPO>VALORE RESTITUITO</TIPO></value> </param> </params> </methodResponse> Stefano Sanna - [email protected] XML-RPC in Java CRS4 - http://www.crs4.it ● ● Il progetto è stato iniziato da Hannes Wallnofer ed è poi diventato parte dell'Apache XML Project. La libreria fornisce: – Classi per realizzare di server e client XML-RPC – Un web server minimale per sistemi non dotati di application server dedicato – Classi per l'integrazione in un servlet container – Classi per l'integrazione di XML-RPC in Applet Stefano Sanna - [email protected] Mapping dei tipi CRS4 - http://www.crs4.it ● I tipi XML-RPC vengono mappati in Java: XML-RPC Java string String int Integer (int) double Double (double) boolean Boolean (boolean) date.iso8601 Date (java.util) base64 byte[] array Vector (java.util) struct Hashtable (java.util) Stefano Sanna - [email protected] XML-RPC Server CRS4 - http://www.crs4.it ● ● ● Un server XML-RPC risponde a invocazioni XML-RPC attraverso richieste su HTTP POST Le invocazioni devono essere interpretate: – Trasformare i parametri secondo la mappa dei tipi locale – Individuare oggetto e metodo al quale l'invocazione si riferisce L'esecutore di una invocazione è detto handler. Stefano Sanna - [email protected] Registrazione implicita CRS4 - http://www.crs4.it ● Il WebServer mappa automaticamente le invocazioni XML-RPC sui metodi pubblici della classe handler (registrazione implicita) Stefano Sanna - [email protected] Registrazione implicita CRS4 - http://www.crs4.it ● Può capitare che si voglia disabilitare questo meccanismo: – per non avere una corrispondenza 1:1 tra metodi della classe handler e signature dei metodi invocabili via XML-RPC – per nascondere alcuni metodi pubblici della classe handler, che devono essere accessibili da altre classi dell'applicazione ma non attraverso l'interfaccia XML-RPC Stefano Sanna - [email protected] Registrazione esplicita CRS4 - http://www.crs4.it ● Il pacchetto fornisce l'interfaccia XmlRpcHandler per la registrazione esplicita Stefano Sanna - [email protected] Registrazione esplicita CRS4 - http://www.crs4.it ● La registrazione esplicita è utile: – per supportare metodi con numero arbitrario di parametri (?) – per “arricchire” l'interfaccia dell'handler con i metodi pubblici di altre classi – modificare a runtime i nomi dei metodi Stefano Sanna - [email protected] Scrittura di un server (1) CRS4 - http://www.crs4.it ● Prima di tutto è necessario predisporre gli handler: public class HandlerImplicito { public HandlerImplicito() {} public String getSystemInfo() { return System.getProperty("os.name"); } public String delay() throws InterruptedException { Thread.currentThread().sleep(2000); return "I have stolen 2 seconds of your life!"; } } Stefano Sanna - [email protected] Scrittura di un server (2) CRS4 - http://www.crs4.it ● L'handler esplicito ha un solo metodo: public class HandlerEsplicito implemens XmlRpcHandler { public HandlerEsplicito() {} public Object execute(String method, Vector params) throws Exception { System.out.println("Metodo: " + method); for (int i =0; i < params.size(); i++) { System.out.println("Parametro " + i + ": " + params.elementAt(i).toString()); } return "Well done!"; } } Stefano Sanna - [email protected] Scrittura di un server (3) CRS4 - http://www.crs4.it ● Si istanzia il server, aggiungendo gli handler, ai quali è assegnato un nome: WebServer server = new WebServer(3569); server.addHandler("implicito", new HandlerImplicito()); server.addHandler("esplicito", new HandlerEsplicito()); ● Ora il server è pronto ad accettare richieste sulla porta 3569... Stefano Sanna - [email protected] XML-RPC Client CRS4 - http://www.crs4.it ● ● ● Un client XML-RPC invia richieste XML ad un server remoto e riceve un XML di risposta La libreria gestisce automaticamente le eccezioni, trasformando i messaggi di errore XML-RPC in eccezioni Java. I metodi da invocare sono individuati da: – URL del server (http://ws.gulch.it/RPC2) – Nome dell'oggetto (dbsoci, mailserver...) – Nome del metodo (getList(), showStat()) Stefano Sanna - [email protected] Scrittura di un client CRS4 - http://www.crs4.it ● XmlRpcClient incapsula le richieste: XmlRpcClient client = new XmlRpcClient ("http://ws.gulch.it:3569/RPC2"); Vector paramsEmpty = new Vector(); Object result = client.execute("implicito.getSystemInfo", paramsEmpty)); ● I parametri sono contenuti all'interno del vettore. Anche se il metodo non accetta parametri, deve essere fornito un vettore vuoto. Stefano Sanna - [email protected] CRS4 - http://www.crs4.it Domande? Stefano Sanna - [email protected] Bibliografia CRS4 - http://www.crs4.it ● Java Network Programming E. Rusty Harold O'Reilly 2000 ISBN: 1565928709 XML-RPC F. Caboni e S. Sanna Gruppo Utenti Linux Cagliari LinuxDay 2003 http://linuxday.gulch.crs4.it Stefano Sanna - [email protected] Conclusioni CRS4 - http://www.crs4.it ● ● ● Java offre una potente libreria per la gestione delle connessioni in rete. Qualsiasi sia la versione utilizzata (Enterprise, Standard, Micro), vi è sempre la possibilità di connettersi ad un server remoto per inviare e ricevere dati java.net.* è una buona palestra per prendere dimestichezza con i più diffusi protocolli di comunicazione! Stefano Sanna - [email protected] CRS4 - http://www.crs4.it Grazie... :-) Stefano Sanna - [email protected]