Linguaggi di Programmazione: Paradigmi di Programmazione Socket, Servlet e Remote Method Invocation Matteo Baldoni Dipartimento di Informatica - Universita` degli Studi di Torino C.so Svizzera, 185 - I-10149 Torino (Italy) e-mail: [email protected] - URL: http://www.di.unito.it/~baldoni Architettura Client/Server Client Servizi Un servizio presso un computertelnet server è identificato dai Server TCP seguenti valori: IP Address • IP (32 bit) ftp • Port (16 bit) Alcuni tipici servizi: • telnet • http • ftp • SMTP, IMAP4 • NFS, DNS, NIS, ... Client http IMAP TCP IP Address IP Address Client TCP IP Address Socket, Servlet e Remote Method Invocation 2 1 Socket • È una astrazione software che rappresenta il terminale di una connessione tra due computer • Per ogni connessione esiste un socket in ognuno dei computer coinvolti • Il client effettua la richiesta di una connessione ad un server per un servizio collegato ad una determinata porta • Se la richiesta è accettata la connessione tra i due applicativi dei due computer è stabilita IP Address Server Socket: <IP Client, Port Client, Port IP Server, Port Server> TPC Port Socket: <IP Client, Port Client, IP Server, Port Server> Client IP Address Socket, Servlet e Remote Method Invocation 3 Socket e Stream in Java • Da ogni socket e`possibile ottenere uno stream di input ed uno di output • Lúso dei socket e`trasparente: readLine e println BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream())); PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())), true); Abilita il flush immediato Socket, Servlet e Remote Method Invocation 4 2 Socket in Java IP Address • Package da importare java.net • La classe java.net.Socket implementa un “client socket” Server – richiede l’indirizzo IP e il numero della porta del servizio a cui vogliamo connetterci ServerSocket Port • La classe java.net.ServerSocket implementa un “server socket” TPC – richiede il numero della porta a cui vogliamo associare il servizio – crea un “server” che attende le richieste di connessione Socket Port – restituisce un socket nel momento in cui accetta un collegamento completamente istanziato nei parametri di collegamento Client (IP e Porta locale e remota). IP Address 5 Socket, Servlet e Remote Method Invocation ServerSocket IP Address • Il metodo accept() si mette in attesa di una richiesta di connessione da un socket client • Le eccezioni che possono essere sollevate sono del tipo IOException (da catturare e gestire!) Server ServerSocket Port Crea un nuovo socket sul server per accettazione di una richiesta di connessione ServerSocket s = new ServerSocket(PORT); […] Socket socket = s.accept(); System.out.println("Accettato socket " + socket); […] Chiude il socket di una connessione precedentemente socket.close(); accettata […] s.close(); Chiude il server Socket, Servlet e Remote Method Invocation 6 3 Socket (Client) Socket socket = new Socket(IP, PORT); […] socket.close(); • Crea una connessione con un’applicazione server (in attesa in una accept()) e restituisce il relativo socket • Le eccezioni che possono essere sollevate sono del tipo IOException (da catturare e gestire!) E`un valore intero, in genere non inferiore a 1024 (riservati al sistema) e rappresenta il numero della porta a cui Vogliamo connetterci E`un oggetto del tipo java.net.InetAddress contenente l’indirizzo IP della macchina a cui vogliamo connetterci ad esempio speedy/130.192.241.1 Port Socket Client IP Address Socket, Servlet e Remote Method Invocation 7 ServerSocket e Socket: gestione errori • E`importante che i socket siano propriamente chiusi al termine di un’applicazione in quando questi sono una risorsa di rete condivisa del sistema • La chiusura dei socket deve essere eseguita indipendentemente dal flusso di esecuzione per questo e`bene utilizzare il costrutto try-finally per garantirne la chiusura • La stessa considerazione vale anche per il ServerSocket […] try { […] String str = in.readLine(); […] out.println("OFFERTA"); […] } catch(IOException e) { System.err.println("IO Exception" + e); } finally { try { socket.close(); } catch(IOException e) { System.err.println("Socket not closed"); } } […] try { Socket socket = s.accept(); […] } finally { s.close(); } Socket, Servlet e Remote Method Invocation 8 4 Un esempio: l’asta • Il server è il banditore: accoglie le offerte e comunica se sono accettabili o no, comunica a richiesta la migliore offerta corrente • I client sono i partecipanti all’asta, possono richiedere qual’è la migliore offerta (e di chi) e possono effettuare rilanci se il loro budget a disposizione lo consente Socket, Servlet e Remote Method Invocation 9 Un esempio: l’asta • Un thread per ogni partecipante all’asta • L’offerta è rappresentata da un oggetto che contine l’offerente e l’offerta in denaro • La migliore offerta è memorizzata in un oggetto il cui accesso è effettuato mediante un metodo synchronized • Per trasmettere un’offerta è necessario convertirla in una stringa (encode) • Il server ricostruisce dalla stringa ricevuta un’offerta (decode) Socket, Servlet e Remote Method Invocation 10 5 Stream di oggetti e Socket • Nell’esempio dell’asta i dati di una offerta venivano opportunamente codificati in una unica stringa per essere trasferiti da un client ad un server • In Java si puo`pero` utilizzare anche stream di oggetti (ObjectInputStream e OutputObjectStream) • In Java e`possibile utilizzare stream di oggetti tramite socket • Gli oggetti devono implementare l’interfaccia java.io.Serializable IP Address Anche stream di oggetti… Server Port TPC Port Client IP Address E` importante che possano essere serializzati 11 Socket, Servlet e Remote Method Invocation Stream di oggetti e Socket […] ServerSocket s = new ServerSocket(PORT); […] Socket socket = s.accept(); […] ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); […] Offerta nuova = (Offerta)in.readObject(); […] out.writeObject("accettata"); […] Server • Importante: la dichiarazione nel client è analoga MA è l’oggetto di tipo ObjectOutputStream va creato prima dell’oggetto di tipo ObjectInputStream pena il deadlock (non è un bug!) • Il polimorfismo viene preservato (si preserva il vero tipo dell’oggetto) Socket, Servlet e Remote Method Invocation 12 6 Servlet e Web Server Servlet: • estensioni del Java API • permettono di scrivere applicazioni indipendenti eseguite all’interno del Web server • possono servire richieste in parallelo • mantengono la sessione di lavoro con il singolo utente • efficienti e semplici da utilizzare rispetto ai programmi CGI Socket, Servlet e Remote Method Invocation 13 Servlet e Web Server Java Virtual Machine HttpServletRequest HttpServletResponse Servlet Client Browser Web Server Socket, Servlet e Remote Method Invocation 14 7 Servlet e Web Server • Una servlet è una classe Java (estensione di HttpServlet). • Un Web Server può ospitare più servlet (con relativi alias) • Quando il processo Web Server viene lanciato, genera un thread Java che inizializza l’oggetto Servlet (metodo init), questo persiste per tutta la durata per processo Web Server • Ogni servlet è un thread all’interno del Web Server (vs CGI dove viene eseguito un processo esterno) Socket, Servlet e Remote Method Invocation 15 Servlet • Ogni volta che il Web Server riceve una richiesta per una servlet S: – identifica la servlet S – invoca il metodo service dell’oggetto Servlet S, per far eseguire le operazioni richieste • Il metodo service rappresenta l’interfaccia del secondo livello di applicazione. Al termine del metodo, S rimanda una risposta sotto forma di pagina HTML • Il Web server spedisce la pagina al browser chiamante Socket, Servlet e Remote Method Invocation 16 8 Richieste ES: http://nbbaldoni.di.unito.it/servlets/splppp0001.Re gistration?cognome1=Baldoni&nome1=Matteo • La classe HttpServletRequest offre i metodi per – determinare i parametri di una richiesta (cognome1, nome1) – estrarre i valori speficati per i parametri nella richiesta (Baldoni, Matteo) • metodi gestiti: POST (doPost), GET (doGet) Socket, Servlet e Remote Method Invocation 17 Servlet e Web Server • Apache, Netscape, Microsoft o Oracle Web Server • le servlet erano inizialmente solo integrate nel Java Web Server della Sun • JSP: Java Server Pages, analogo di ASP (Active Server Pages), progetto Tomcat • Modulo ApacheJServ Socket, Servlet e Remote Method Invocation 18 9 Un esempio: Registration.java • Analizzare le informazioni dei componenti di un gruppo inserite tramite una form ed inviate mediante il metodo POST • Se non sono rilevati errori spedire una mail con il numero del gruppo (assegnato in modo automatico) e spedire le varie infomazioni raccolte tramite mail • Se sono rilevati errori nell’immissione dei dati nella form segnalarli tramite una pagina html Socket, Servlet e Remote Method Invocation 19 registration.html <FORM ACTION="https://nbbaldoni.di.unito.it/servlets/splppp0001.Registration" METHOD="post”> […] <INPUT TYPE="text" NAME=cognome1 VALUE="" SIZE=40> […] <INPUT TYPE="text" NAME=nome1 VALUE="" SIZE=40> […] <INPUT TYPE="text" NAME=email1 VALUE="" SIZE=40> […] <INPUT TYPE="text" NAME=cognome2 VALUE="" SIZE=40> […] <INPUT TYPE="text" NAME=nome2 VALUE="" SIZE=40> […] <INPUT TYPE="text" NAME=email2 VALUE="" SIZE=40> […] <TEXTAREA NAME=commenti COLS=50 ROWS=5></TEXTAREA> <br> […] <INPUT TYPE="submit" VALUE="Inoltra">&nbsp;&nbsp; <INPUT TYPE="reset" VALUE="Cancella">&nbsp;&nbsp; </FORM> Socket, Servlet e Remote Method Invocation 20 10 Registration.java public class Registration extends HttpServlet { Viene utilizzato sia per l’invio con POST sia con GET […] int counter; public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); […] MIME type della risposta PrintWriter per l’output } Socket, Servlet e Remote Method Invocation 21 Registration.java Attenzione questa classe […] l’ho definita io per facilitare HTMLPage page = new HTMLPage(); la creazione di una pagina HTML […] String cognome1 = req.getParameter("cognome1").trim(); String nome1 = req.getParameter("nome1").trim(); String email1 = req.getParameter("email1").trim(); […] Estrazione dei parametri inviati int localCounter; alla servlet dalla form synchronized(this) { Incremento del contatore localCounter = counter++; per il numero del gruppo saveState(); } counter è una variabile condivisa dai vari thread delle diverse richieste della stessa servlet […] out.println(page); […] Output della pagina HTML Socket, Servlet e Remote Method Invocation 22 11 Registration.java public void init(ServletConfig config) Questo metodo è eseguito throws ServletException { quando la servlet è creata super.init(config); (una volta sola alla prima try { richiesta) FileReader fileReader = new FileReader("/tmp/InitDestroyCounter.initial"); BufferedReader bufferedReader = new BufferedReader(fileReader); String initial = bufferedReader.readLine(); counter = Integer.parseInt(initial); return; } catch(FileNotFoundException ignored) { } catch(IOException ignored) { } catch(NumberFormatException ignored) { } counter = 1; } Questo metodo è eseguito public void destroy() { saveState(); } automaticamente prima dello shutdown del Web Server 23 Socket, Servlet e Remote Method Invocation Comunicazione distribuita Java VM2 Java VM1 Port 2 Port1 Invocazione di metodi sull’oggetto remoto Socket, Servlet e Remote Method Invocation 24 12 RMI: goal • Rendere trasparente l’invocazione remota di metodi su oggetti Java che risiedono su diverse Virtual machines (evoluzione di Remote Procedure Call, RPC) • offrire un modello distribuito che preservi maggiormente la semantica degli oggetti Java • rendere il piu’ semplice possibile la scrittura di applicazioni distribuite Socket, Servlet e Remote Method Invocation Supporta vari protocolli di invocazione: unicast, multicast 25 Architettura RMI Si occupa di preparare (marshalling) la remote call e gli oggetti per la trasmissione Applicazione Server Applicazione Client Livello stub Livello di riferimento remoto Livello di Trasporto Livello stub Ogni livello è indipenLivello di riferimento dente dall’altro! remoto Rete Livello di Trasporto Si occupa della effettiva connessione, Skeleton per le versioni della identificazione degli oggetti remoti, precedenti a Java 1.2 del mezzo, TCP/IP, UDP (nota: RMI usa per ora solo TCP/IP) Socket, Servlet e Remote Method Invocation 26 13 Architettura RMI • Il sistema RMI e` costituito da tre livelli per supportare flessibilità nella comunicazione • Ogni livello ha le sue interfacce di comunicazione con relativi protocolli – stub (e skeleton) layer: canale di comunicazione tra clients e server – remote reference layer: supporto di diversi protocolli di invocazione tipo Unicast e Multicast – transport layer: supporta la comunicazione a basso livello, tipo TCP/IP Socket, Servlet e Remote Method Invocation 27 RMI Simile all’invocazione di metodi locali • i parametri dei metodi possono essere oggetti • il polimorfismo e` supportato: oggetti diversi possono rispondere a stessi messaggi ma • i client interagiscono con interfacce di oggetti (stub) non con la loro implementazione (che sta nella VM remota) • parametri passati per copia, non per referenza (passaggio per referenza solo dentro a una VM) Socket, Servlet e Remote Method Invocation 28 14 RMI in pratica • L’oggetto blu sulla JVM Client desidera inviare un messaggio all’oggetto rosso sulla JVM Server, gli oggetti giallo e azzurro fanno parte dei parametri del messaggio • L’oggetto rosso sulla JVM Server terminata l’esecuzione restituisce l’oggetto verde come valore di ritorno oppure solleva un’eccezione JVM Client JVM messaggio Server valore di ritorno o eccezione IP Address IP Address Socket, Servlet e Remote Method Invocation 29 RMI in pratica: Interfaccia • Il client deve disporre di un’interfaccia che descriva l’oggetto remoto • È necessario che l’interfaccia estenda java.rmi.Remote • Ogni metodo descritto puo` lanciare un’eccezione di tipo java.rmi.RemoteException public interface Distributor extends java.rmi.Remote { Job getNewJob() throws java.rmi.RemoteException; Job getNewJob(Message msg) throws java.rmi.RemoteException; } Socket, Servlet e Remote Method Invocation 30 15 RMI in pratica: Implementazione • Il Server implementa la classe che esegue praticamente i metodi che sono descritti nell’interfaccia remota • Questa classe è necessario che estenda la classe java.rmi.server.UnicastRemoteObject (attualemente l’unica disponibile, multicast in una futura versione) che rende accessibile le sue istanze remotamente (puo` creare uno stub per la classe) public class DistributorImpl extends java.rmi.server.UnicastRemoteObject implements Distributor { [..] public Job getNewJob() throws java.rmi.RemoteException { […] } […] } 31 Socket, Servlet e Remote Method Invocation RMI in pratica: rmiregistry, bind (rebind) • Gli oggetti remoti sono individuati tramite un IP, un numero di porta e un nome (una stringa) • server registry: processo “pagine registry gialle” <IP, port, name> <IP, port, name> JVM Client IP Address Si registra l’oggetto rosso presso il servizio di pagine gialle Naming.rebind JVM Lo stub è necessario durante il bind Server stub Non è necessario registrare Reference Layer: l’oggetto apertura di un verde server socket Socket, Servlet e Remote Method Invocation IP Address 32 16 RMI in pratica: rmiregistry, bind (rebind) • La classe Naming appartiene al package java.rmi • rmiregistry puo` anche essere attivato indipendentemente dal server tramite il comando “rmiregistry 2000” public DistributorImpl() throws RemoteException { porta […] try { java.rmi.registry.LocateRegistry.createRegistry(2000); Naming.rebind("rmi://130.192.239.145:2000/distributor",this); } catch (Exception e) { System.err.println("Failed to bind to RMI Registry"); System.exit(1); oggetto } IP address nome remoto } 33 Socket, Servlet e Remote Method Invocation RMI in pratica: rmiregistry, lookup • Il client ottiene uno stub (surrogato dell’oggetto rosso presso il client) tramite il server registry • Deve conoscerne IP, porta e nome <IP, port, name> <IP, port, name> registry Naming.lookup JVM JVM Server Client stub stub IP Address IP Address Socket, Servlet e Remote Method Invocation 34 17 RMI in pratica: rmiregistry, lookup • L’oggetto remoto è contattato tramite il server registry • È necessario conoscerne l’indirizzo IP, il numero della porta e il nome con cui è registrato public class Client { Distributor server; […] public Client() { Tipo definito dall’interfaccia! try { server = (Distributor)Naming.lookup( "rmi://130.192.239.145:2000/distributor”); } catch(Exception e) { System.out.println("Failed to find distributor" + e.getMessage()); } } 35 Socket, Servlet e Remote Method Invocation RMI in pratica: stub client • L’oggetto blu invia un messaggio al surrogato oggetto rosso presso lo stub client • Lo stub client inizializza la chiamata remota ed organizza i parametri da inviare messaggio JVM Garbage collector: mantiene un riferimento all’oggetto rosso: non puo` essere eliminato <IP, port, name> registry JVM Server Client stub IP Address stub L’oggetto giallo e azzurro vengono serializzati e organizzati per la spedizione (marshalling) Socket, Servlet e Remote Method Invocation IP Address 36 18 RMI in pratica: invio messaggio • L’oggetto remoto è ora utilizzabile come un qualsiasi oggetto locale • lo stub ne è un surrogato public class Client { [..] public void process() { try { Job myJob = server.getNewJob(new Message("Richiesta Job!")); myJob.process(); } catch (Exception e) { System.out.println("Failed to receive job " + e.getMessage()); } } [..] } 37 Socket, Servlet e Remote Method Invocation RMI in pratica: connessione • Il livello di trasporto è responsabile per una connessione, nel server ascolta le richieste in arrivo • mantiene la tabella degli oggetti remoti nel particolare address space • Scambia le informazioni con il reference layer JVM <IP, port, name> registry JVM Server Client stub IP Address Il livello di trasporto apre un socket per la connessione stub IP Address TCP/IP Anche HTTP se c’è Connessione temporanea! un firewall Socket, Servlet e Remote Method Invocation 38 19 RMI in pratica: stub server • Lo stub server riorganizza i parametri (unmarshalling) • individua l’oggetto da chiamare attivando il metodo desiderato (informazione contenuta nel pacchetto ricevuto) JVM Client stub IP Address Attenzione non vi è nessun riferimento agli oggetti giallo e azzurro sul client passati come parametro: sono copie! <IP, port, name> registry JVM Server stub IP Address TCP/IP 39 Socket, Servlet e Remote Method Invocation RMI in pratica: la risposta • Lo stub del server cattura e riorganizza il valore restituito dall’evecuzione del metodo sull’oggetto rosso • Lo stub server invia allo stub del client un pacchetto contenente le informazioni raccolte (l’oggetto verde) JVM <IP, port, name> registry JVM Invia valore di ritorno o eccezione Server Client stub stub IP Address IP Address TCP/IP Socket, Servlet e Remote Method Invocation 40 20 RMI in pratica: la risposta • Il server esegue il metodo invocato ed invia il valore di ritorno come se la chiamata fosse locale public DistributorImpl() throws RemoteException { […] public Job getNewJob(Message msg) { System.out.println(msg); if( count < jobs.size()) { return (Job)jobs.elementAt(count++); } else { System.exit(0); } return null; } […] } 41 Socket, Servlet e Remote Method Invocation RMI in pratica: ricezione • Lo stub client rioganizza le informazioni ricevute o l’eccezione sollevata • La connessione viene quindi disattivata JVM <IP, port, name> registry JVM Server Client stub stub IP Address IP Address TCP/IP Socket, Servlet e Remote Method Invocation 42 21 RMI in pratica: ricezione • Il valore di ritorno è utilizzato come se fosse ora un oggetto locale ma non ha nessun riferimento con quello creato sul server (come per I parametri inviati con la chiamata) public class Client { [..] public void process() { try { Job myJob = server.getNewJob(new Message("Richiesta Job!")); myJob.process(); } catch (Exception e) { System.out.println("Failed to receive job " + e.getMessage()); } } [..] } 43 Socket, Servlet e Remote Method Invocation RMI: riassunto • Nell’esempio che vedremo: – javac *.java – rmic -v1.2 DistributorImpl – rmiregistry 2000 & – java DistributorImpl – java Client Crea il file: DistributorImpl_Stub.class Senza l’opzione viene creato anche il file DistributorImpl_Skel.class compatibile sia con Java 1.1 e 1.2 Attiva il server Esegue il client Attiva il server registry Dopo in bind è attivo un thread separato per gestire le richieste di connessione, termina con CTRL-C Socket, Servlet e Remote Method Invocation 44 22 RMI: download dello stub <IP, port, name> • Lo stub generato dal server deve essere disponibile al client ma questo, in genere, è Web Server registry remoto… • Puo` essere scaricato tramite download HTTP HTTP <IP, port, name> JVM JVM Server Client stub file di criteri IP Address stub Security Manager IP Address TCP/IP Socket, Servlet e Remote Method Invocation 45 RMI: security manager • RMISecurityManager con l’associato file di criteri permette di scaricare mediante il protocollo HTTP • È necessario un file di criteri public class Client { Distributor server; […] public Client() { try { System.setSecurityManager(new RMISecurityManager()); server = (Distributor)Naming.lookup( "rmi://130.192.239.145:2000/distributor”); } catch(Exception e) { System.out.println("Failed to find distributor" + e.getMessage()); } } Socket, Servlet e Remote Method Invocation 46 23 RMI: security manager • Per utilizzare il file di criteri nel client: – java -Djava.security.policy=client.policy • Per indicare da dove scaricare il file stub dal server: – java Djava.rmi.server.codebase=http://nbbaldoni.di.unito.it/~b aldoni/dowload/rmi1/ DistributorImpl grant file client.policy { permission java.net.SocketPermission "130.192.239.145:1024-65535", "connect"; permission java.net.SocketPermission "130.192.239.1:80", "connect"; }; Socket, Servlet e Remote Method Invocation 47 RMI: polimorfismo • L’oggetto inviati tramite RMI preservano il loro vero tipo <IP, port, name> • Ma se il valore restituito è piu` specializzato di quello atteso dal Web Server client che succede? registry • Download delle classi per trattare download l’oggetto specializzato! HTTP <IP, port, name> JVM JVM Server Client stub file di criteri IP Address stub Security Manager IP Address TCP/IP Socket, Servlet e Remote Method Invocation 48 24 RMI: polimorfismo • E se l’oggetto inviato è piu` specializzato di quello atteso dal server? • Download delle classi via HTTP durante l’esecuzione del metodo sull’oggetto remoto (sul server) • IL server necessita a sua volta di un Security Manager per il controllo delle classi scaricate • È nececessario un file di criteri per il download anche per il server • Il client deve specificare dove scaricare le classi 49 Socket, Servlet e Remote Method Invocation RMI: polimorfismo <IP, port, name> Web Server <IP, port, name> registry HTTP Web Server download download HTTP JVM JVM Server Client stub file di criteri IP Address stub file di criteri Security Manager IP Address TCP/IP Socket, Servlet e Remote Method Invocation 50 25