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: baldoni@di.unito.it - URL: http://www.di.unito.it/~baldoni Architettura / Un servizio presso un computerserver è identificato dai seguenti valori: IP (32 bit) Port (16 bit) Servizi telnet TCP ftp Alcuni tipici servizi: telnet http ftp SMTP, IMAP4 NFS, DNS, NIS,... TCP http TCP IMAP 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 Port Socket: <IP, Port, IP, Port > TPC Port Socket: <IP, Port, IP, Port > 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 Package da importare java.net La classe java.net.socket implementa un client socket richiede l indirizzo IP e il numero della porta del servizio a cui vogliamo connetterci La classe java.net.socket implementa Socket Port un server socket richiede il numero della porta a cui vogliamo associare il servizio crea un server che attende le richieste di TPC connessione restituisce un socket nel momento in cui accetta un collegamento completamente istanziato nei parametri di collegamento (IP e Porta locale e remota). Port Socket Socket, Servlet e Remote Method Invocation 5 Socket 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!) Socket Socket s = new Socket(PORT); Socket socket = s.accept(); System.out.println("Accettato socket " + socket); socket.close(); s.close(); Port Crea un nuovo socket sul server per accettazione di una richiesta di connessione Chiude il socket di una connessione precedentemente accettata Chiude il server Socket, Servlet e Remote Method Invocation 6 3
Socket () Socket socket = new Socket(IP, PORT); socket.close(); E`un valore intero, in genere non inferiore a 1024 (riservati al sistema) e rappresenta il numero della porta a cui Vogliamo connetterci 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 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 Socket, Servlet e Remote Method Invocation 7 Socket 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 Socket 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 Anche stream di oggetti Port TPC Port E` importante che possano essere serializzati Socket, Servlet e Remote Method Invocation 11 Stream di oggetti e Socket Socket s = new Socket(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"); 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 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 Java Virtual Machine HttpServletRequest HttpServletResponse Browser Servlet Web Socket, Servlet e Remote Method Invocation 14 7
Servlet e Web Una servlet è una classe Java (estensione di HttpServlet). Un Web può ospitare più servlet (con relativi alias) Quando il processo Web viene lanciato, genera un thread Java che inizializza l oggetto Servlet (metodo init), questo persiste per tutta la durata per processo Web Ogni servlet è un thread all interno del Web (vs CGI dove viene eseguito un processo esterno) Socket, Servlet e Remote Method Invocation 15 Servlet Ogni volta che il Web 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 Apache, Netscape, Microsoft o Oracle Web le servlet erano inizialmente solo integrate nel Java Web della Sun JSP: Java Pages, analogo di ASP (Active 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"> <INPUT TYPE="reset" VALUE="Cancella"> </FORM> Socket, Servlet e Remote Method Invocation 20 10
Registration.java public class Registration extends HttpServlet { int counter; Viene utilizzato sia per l invio con POST sia con GET 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 HTMLPage page = new HTMLPage(); int localcounter; synchronized(this) { localcounter = counter++; savestate(); out.println(page); Attenzione questa classe l ho definita io per facilitare 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 alla servlet dalla form Incremento del contatore per il numero del gruppo counter è una variabile condivisa dai vari thread delle diverse richieste della stessa servlet Output della pagina HTML Socket, Servlet e Remote Method Invocation 22 11
Registration.java public void init(servletconfig config) throws ServletException { super.init(config); try { FileReader filereader = richiesta) 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; public void destroy() { savestate(); Questo metodo è eseguito quando la servlet è creata (una volta sola alla prima Questo metodo è eseguito automaticamente prima dello shutdown del Web Socket, Servlet e Remote Method Invocation 23 Comunicazione distribuita Java VM1 Java VM2 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 25 Supporta vari protocolli di invocazione: unicast, multicast Architettura RMI Si occupa di preparare (marshalling) la remote call e gli oggetti per la trasmissione Applicazione Applicazione Livello Livello di riferimento remoto Ogni livello è indipendente dall altro! Livello Livello di riferimento remoto Livello di Trasporto Rete Livello di Trasporto Si occupa della effettiva connessione, della identificazione degli oggetti remoti, del mezzo, TCP/IP, UDP (nota: RMI usa per ora solo TCP/IP) Skeleton per le versioni precedenti a Java 1.2 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 (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 () 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 desidera inviare un messaggio all oggetto rosso sulla, gli oggetti giallo e azzurro fanno parte dei parametri del messaggio L oggetto rosso sulla terminata l esecuzione restituisce l oggetto verde come valore di ritorno oppure solleva un eccezione messaggio valore di ritorno o eccezione 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 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 per la classe) public class DistributorImpl extends java.rmi.server.unicastremoteobject implements Distributor { [..] public Job getnewjob() throws java.rmi.remoteexception { Socket, Servlet e Remote Method Invocation 31 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 gialle Si registra l oggetto rosso presso il servizio di pagine gialle registry Naming.rebind Non è necessario registrare Reference Layer: l oggetto apertura di un verde server socket Lo è necessario durante il bind Socket, Servlet e Remote Method Invocation 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); IP address nome oggetto remoto Socket, Servlet e Remote Method Invocation 33 RMI in pratica: rmiregistry, lookup Il client ottiene uno (surrogato dell oggetto rosso presso il client) tramite il server registry Deve conoscerne IP, porta e nome Naming.lookup registry 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 { Distributor server; public () { 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()); Socket, Servlet e Remote Method Invocation 35 RMI in pratica: client L oggetto blu invia un messaggio al surrogato oggetto rosso presso lo client Lo client inizializza la chiamata remota ed organizza i parametri da inviare messaggio Garbage collector: mantiene un riferimento all oggetto rosso: non puo` essere eliminato registry L oggetto giallo e azzurro vengono serializzati e organizzati per la spedizione (marshalling) Socket, Servlet e Remote Method Invocation 36 18
RMI in pratica: invio messaggio L oggetto remoto è ora utilizzabile come un qualsiasi oggetto locale lo ne è un surrogato public class { [..] 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()); [..] Socket, Servlet e Remote Method Invocation 37 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 registry Il livello di trasporto apre un socket per la connessione Anche HTTP se c è TCP/IP Connessione temporanea! un firewall Socket, Servlet e Remote Method Invocation 38 19
RMI in pratica: server Lo server riorganizza i parametri (unmarshalling) individua l oggetto da chiamare attivando il metodo desiderato (informazione contenuta nel pacchetto ricevuto) registry Attenzione non vi è nessun riferimento agli oggetti giallo e azzurro sul client passati come parametro: sono copie! TCP/IP Socket, Servlet e Remote Method Invocation 39 RMI in pratica: la risposta Lo del server cattura e riorganizza il valore restituito dall evecuzione del metodo sull oggetto rosso Lo server invia allo del client un pacchetto contenente le informazioni raccolte (l oggetto verde) registry Invia valore di ritorno o eccezione 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; Socket, Servlet e Remote Method Invocation 41 RMI in pratica: ricezione Lo client rioganizza le informazioni ricevute o l eccezione sollevata La connessione viene quindi disattivata registry 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 { [..] 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()); [..] Socket, Servlet e Remote Method Invocation 43 RMI: riassunto Nell esempio che vedremo: javac *.java rmic -v1.2 DistributorImpl rmiregistry 2000 & java DistributorImpl java Esegue il client Attiva il server Dopo in bind è attivo un thread separato per gestire le richieste di connessione, termina con CTRL-C 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 registry Socket, Servlet e Remote Method Invocation 44 22
RMI: download dello Lo generato dal server deve essere disponibile al client ma questo, in genere, è remoto registry Web Puo` essere scaricato tramite download HTTP HTTP file di criteri Security Manager 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 { Distributor server; public () { 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 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 Ma se il valore restituito è piu` specializzato di quello atteso dal client che succede? registry Web Download delle classi per trattare download l oggetto specializzato! HTTP file di criteri Security Manager 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 Socket, Servlet e Remote Method Invocation 49 RMI: polimorfismo Web HTTP download registry download HTTP Web file di criteri file di criteri Security Manager TCP/IP Socket, Servlet e Remote Method Invocation 50 25