Lezione 6: Remote Method
           Invocation
         Corso di Programmazione in Rete
        Laurea Magistrale in Ing. Informatica
          Università degli Studi di Salerno



1
Outline
    ✦ Middleware

    ✦ Remote Method Invocation

    ✦ Definizione e uso di oggetti remoti




2
Modelli distribuiti
    ✦ Molte applicazioni di rete possono essere
      realizzate usando un paradigma Client-
      Server
     •   il client invia la richiesta di un’operazione a un
         server
     •   il server elabora la richiesta
     •   il server fornisce una risposta al client
    ✦ Esempi
     •   Il protocollo HTTP per il World Wide Web
     •   La posta elettronica
     •   Il nostro sistema di chat
3
Modelli distribuiti
    ✦ Java permette una gestione semplificata
      dei socket, con il quale il programmatore
      è in grado di realizzare un meccanismo di
      comunicazione.
    ✦ I socket risolvono solo il problema di
      fondo “come instaurare la connessione”,
      ma non definiscono le modalità di
      comunicazione.
     •   codifica delle informazioni
     •   estensibilità dei protocolli

4
     •   gestione efficiente delle connessioni
Middleware
    ✦ Un middleware è uno strato di software
      che gestisce i meccanismi di
      comunicazione tra più processi, situati
      possibilmente su macchine diverse,
      presentando allo sviluppatore
      un’astrazione di livello più elevato, che gli
      consenta di ignorare una serie di
      problemi legati alla comunicazione
     •   Semplicità di sviluppo
     •   Indipendenza dagli specifici meccanismi di
         comunicazione

5
Middleware

      Client                        Server




    Middleware                    Middleware


                    Connessione

    Trasporto                     Trasporto




6
Middleware
    ✦ Esistono delle forti analogie concettuali
      tra un sistema distribuito client-server e
      la programmazione orientata agli oggetti
                         Invocazione metodo

               Oggetto                        Oggetto
                              Risultato




                            Richiesta

               Client                         Server
                              Risposta



    ✦ I middleware object-oriented usano queste
      analogie per presentare allo sviluppatore
      un modello “familiare”

7
Middleware
    ✦ In un middleware orientato agli oggetti,
      gli oggetti di un processo possono
      accedere ai servizi di un altro processo
      usando l’astrazione di oggetti remoti
    ✦ L’invocazione di metodi su oggetti remoti
      in realtà comporta la trasmissione di un
      messaggio al server che implementa tali
      oggetti, e l’attesa della risposta di tale
      server (comunicazione sincrona)

8
Remote Method Invocation
    ✦ Gli oggetti remoti sono gestiti attraverso
      riferimenti (Remote Reference) che si
      comportano, dal punto di vista dello
      sviluppatore, come riferimenti a oggetti
      locali (o quasi). L’unica differenza è il
      modo con cui vengono ottenuti questi
      riferimenti.
    ✦ La soluzione full-Java per l’esecuzione di
      codice remoto è conosciuta con il nome di
      RMI (Remote Method Invocation)

9
Architettura RMI

     ✦ quando un oggetto desidera invocare un metodo
       di un altro oggetto, deve prima ricavarne un
       riferimento (indirizzo), istanziandolo
       direttamente o ricevendone l’indirizzo
       dall’esterno, e successivamente eseguire un
       istruzione del tipo:
       nome_oggetto.nome_metodo(lista_parametri)




10
Architettura RMI

     ✦ Nel caso distribuito si deve ricavare il riferimento
       all’oggetto remoto e invocare i metodi a distanza
       •   la soluzione proposta da RMI consiste nello
           scaricare in locale un “rappresentante”
           dell’oggetto remoto e di considerarlo come se si
           trattasse a tutti gli effetti di un oggetto locale


     nome_ogg_remoto.nome_metodo(lista_parametri)




11
Architettura RMI
        Lo strato più alto è costituito su entrambi i lati
        (client/server) dall’applicazione che viene eseguita
        sulla Java-Machine




     ✦ RMI Client
        ‣   applicazione che effettua le chiamate ai metodi degli
            oggetti remoti residenti sul lato server
     ✦ RMI Server
        ‣   Applicazione che gestisce gli oggetti serventi




12
Architettura RMI
                  …sotto il livello applicazione si trovano i due
                  protagonisti di tutto il meccanismo RMI, lo stub e lo
                  skeleton, due rappresentanti della stessa entità.



Compiti dello stub sul client:                    Compiti dello skeleton sul
• inizia una chiamata via RRL                     server:
     ‣ invia i parametri (serializzazione)
                                                  • attende richieste
• invoca il metodo via RRL                        • riceve i dati dal client
     ‣ attende il completamento dell’operazione
                                                    ‣ deserializzazione dei parametri
• completa la chiamata                            • chiama l’effettiva
     ‣ riceve e deserializza il risultato
• ritorna                                         implementazione del metodo
                                                  • trasmette la risposta al client
                                                    ‣ serializza il risultato


13
Architettura RMI
           …i lati server e client sono collegati con il
           sottostante Remote Reference Layer (RRL) che a
           sua volta si appoggia al Transport Layer (TL)




      Al livello RRL viene instaurato un collegamento
      virtuale fra i due lati, client e server, mentre
      fisicamente la connessione avviene al livello
      sottostante
        (RRL) basato su protocollo generico ed indipendente dal particolare tipo di
        stub/skeleton




14
Architettura RMI
           …i lati server e client sono collegati con il
           sottostante Remote Reference Layer (RRL) che a
           sua volta si appoggia al Transport Layer (TL)


      Quando il TL riceve una richiesta di connessione da
      parte del client, localizza il server RMI relativo
      all’oggetto remoto richiesto:
        localizzazione   del server RMI
        connessione    per mezzo di un socket appositamente creato per
        il servizio
        passa la connessione al lato client del RRL ed aggiunge un
        riferimento dell’oggetto remoto nella tabella opportuna
        controllo   dello stato delle connessioni (es. timeout)



15
Architettura RMI
     RMI Client                               RMI Server


       Stub                                   Skeleton
                       Connessione virtuale

       RRL                                      RRL

        TL                                       TL

              socket                                   socket
       TCP                                      TCP
        IP                                        IP
     Network             Connessione fisica
                                              Network

16
Definizione e uso di oggetti remoti

     ✦ I passi da seguire sono:
      •   definire un’interfaccia remota
      •   definire un’implementazione dell’interfaccia
      •   creare un’applicazione server che istanzi
          l’implementazione e la renda pubblicamente
          accessibile
      •   creare un client che ottenga un riferimento
          remoto e lo usi per richiedere le operazioni al
          server



17
Interfaccia remota
     ✦ Per ogni oggetto che deve essere
       utilizzato come oggetto remoto occorre
       definire una interface detta interfaccia
       remota
      •   l’interfaccia remota deve estendere Remote
      •   ogni metodo deve dichiarare che può sollevare
          l’eccezione RemoteException
      •   Sia Remote che RemoteException sono definite
          nel package java.rmi



18
Interfaccia remota
      ✦ Esempio:
         •    supponendo che l’oggetto remoto che vogliamo
              realizzare svolga le operazioni aritmetiche
              fondamentali
     import java.rmi.*;

     public interface Calculator extends Remote {
     	 double add(double a, double b) throws RemoteException;
     	 double subtract(double a, double b) throws RemoteException;
     	 double divide(double a, double b) throws RemoteException;
     	 double multiply(double a, double b) throws RemoteException;
     }




19
Interfaccia remota
     ✦ I parametri e il valore di ritorno dei
       metodi dell’interfaccia remota possono
       appartenere solo a un insieme ristretto di
       tipi:
      •   tipi atomici (es. int)
      •   classi serializzabili
      •   interfacce remote (anche diverse da quella che
          contiene il metodo)
      •   array i cui elementi appartengono ai tipi
          sopraindicati


20
Implementazione
     ✦ La classe che contiene l’effettiva
       implementazione dell’oggetto remoto:
      •   deve essere derivata da
          java.rmi.server.UnicastRemoteObject
      •   deve dichiarare che implementa l’interfaccia
          remota
      •   inoltre deve avere un costruttore (anche vuoto)
          che dichiara di sollevare RemoteException
     ✦ Per convenzione, il nome della classe
       termina generalmente con “Impl”

21
Implementazione
      ✦ Esempio
     import java.rmi.*;
     import java.rmi.server.*;



     public class CalculatorImpl extends UnicastRemoteObject implements Calculator {
     	 public CalculatorImpl() throws RemoteException {
        	 // Costruttore vuoto	
     	 }
     	 public double add(double a, double b) {
     	 	 return a+b;
     	 }
     	 public double divide(double a, double b) {
     	 	 return a/b;
     	 }
     	 public double multiply(double a, double b) {
     	 	 return a*b;
     	 }
     	 public double subtract(double a, double b) {
     	 	 return a-b;
     	 }
     }
22
Stub e skeleton
     ✦ Tradizionalmente, una volta definita la
       classe di implementazione, occorreva
       richiamare il tool rmic per effettuare la
       generazione dello stub e dello skeleton
       corrispondenti
     ✦ Da Java 1.2, lo skeleton viene generato
       dinamicamente in modo automatico
     ✦ Da Java 1.5, anche lo stub viene generato
       dinamicamente

23
Applicazione server

     ✦ L’applicazione server ha il compito di:
      •   creare una o più istanze delle classi che
          implementano le interfacce remote
      •   rendere accessibili al client i riferimenti remoti a
          queste istanze
          ‣   come fa il client a ottenere un riferimento remoto dal
              server?




24
Applicazione server
     ✦ Il modo principale con cui un client
       ottiene un remote reference è attraverso
       il valore di ritorno di un metodo remoto
      •   se il client ha un riferimento a un oggetto remoto
          A, l’oggetto può fornirgli il riferimento a un altro
          oggetto remoto B, che a sua volta può fornirgli il
          riferimento a C e così via
     ✦ Problema: “bootstrap”
      •   come fa il client a ottenere il riferimento al primo
          oggetto remoto?


25
Registry
     ✦ Per risolvere il problema del bootstrap il
       Java Development Kit mette a
       disposizione l’applicazione rmiregistry
      •   name server che associa nomi simbolici (o più
          precisamente URL) a riferimenti remoti
      •   il server registra i riferimenti agli oggetti di
          bootstrap (quelli da cui il client deve partire per
          accedere all’applicazione)
      •   il client consulta il name server usando un
          protocollo ad hoc (già implementato da una classe
          della libreria standard)

26
Registrazione di un riferimento

     ✦ Occorre usare il metodo statico rebind
       della classe Naming:
      ‣   static void rebind(String name, Remote obj)
                         throws RemoteException, MalformedURLException

      •   name è il nome assegnato all’oggetto (parte finale
          dell’URL)
      •   obj è l’istanza della classe di implementazione
      •   l’oggetto viene registrato su un rmiregistry che si
          trova sulla stessa macchina



27
Applicazione server
      ✦ Esempio


     import java.net.*;
     import java.rmi.*;

     public class CalculatorServer {
     	 public static void main(String args[])
                 throws RemoteException, MalformedURLException {
     	 	 Calculator calc=new CalculatorImpl();
     	 	 Naming.rebind("calc", calc);
     	 }
     }




28
Il client
     ✦ Il client ottiene un riferimento agli oggetti
       registrati usando il metodo lookup della
       classe Naming:
      •   static Remote lookup(String url)
                         throws NotBoundException,
                                MalformedURLException,
                                RemoteException
     ✦ Il formato dell’URL è:
      •   rmi://host/name



29
Il client

     ✦ Una volta ottenuto un riferimento (dal
       registry o da un altro oggetto remoto), il
       client lo usa come se fosse un oggetto
       “normale”
      •   occorre ricordare che ogni metodo dell’interfaccia
          remota può sollevare un’eccezione controllata
          RemoteException




30
Il client
       ✦ Esempio

     import java.net.*;
     import java.rmi.*;

     public class CalculatorClient {
     	 public static void main(String args[])
                       throws RemoteException, MalformedURLException, NotBoundException {
     	 	 Calculator calc=(Calculator)Naming.lookup("rmi://localhost/calc");
     	 	 System.out.print("9 per 9 fa "+calc.multiply(9,9));
     	 }
     }




31

More Related Content

PDF
Lezione 7: Remote Method Invocation e SSL
PDF
Lezione 10: Web Service in Java (2)
PDF
Lezione 9: Web Service in Java
PDF
Lezione 11: Accesso ai RESTful Web Services in Java
PDF
Lezione 8: Introduzione ai Web Service
PDF
Lezione 5: Socket SSL/ TLS
PDF
Corso Java 3 - WEB
PDF
Lezione12: Autenticazione e gestione delle sessioni in REST
Lezione 7: Remote Method Invocation e SSL
Lezione 10: Web Service in Java (2)
Lezione 9: Web Service in Java
Lezione 11: Accesso ai RESTful Web Services in Java
Lezione 8: Introduzione ai Web Service
Lezione 5: Socket SSL/ TLS
Corso Java 3 - WEB
Lezione12: Autenticazione e gestione delle sessioni in REST

What's hot (20)

PDF
Corso di servlet jsp e pattern
PPT
[ITA] Introduzione ai web services: SOAP, WSDL, UDDI
PDF
Corso Java 2 - AVANZATO
PDF
Lezione 9: Design Pattern Comportamentali
PDF
Lezione 6a: Design Pattern Strutturali
PDF
Corso Javascript
PDF
Corso web services
PPTX
Silverlight m v-vm @ DotNetteria
PDF
Lezione 8: Design Pattern Comportamentali
PDF
PDF
Lezione 6b: Design Pattern Strutturali
PPTX
Portlet JSR168/286
PDF
Simple Cloud API: accesso semplificato al cloud computing
ODP
Design Pattern
PDF
Drupal Day 2011 - Node.js e Drupal
PDF
Lezione 5: Design Pattern Creazionali
PPTX
Javascript avanzato: sfruttare al massimo il web
PDF
Tutorial su Java RMI
PDF
Codemotion fuse presentation
PPTX
Web sockets
Corso di servlet jsp e pattern
[ITA] Introduzione ai web services: SOAP, WSDL, UDDI
Corso Java 2 - AVANZATO
Lezione 9: Design Pattern Comportamentali
Lezione 6a: Design Pattern Strutturali
Corso Javascript
Corso web services
Silverlight m v-vm @ DotNetteria
Lezione 8: Design Pattern Comportamentali
Lezione 6b: Design Pattern Strutturali
Portlet JSR168/286
Simple Cloud API: accesso semplificato al cloud computing
Design Pattern
Drupal Day 2011 - Node.js e Drupal
Lezione 5: Design Pattern Creazionali
Javascript avanzato: sfruttare al massimo il web
Tutorial su Java RMI
Codemotion fuse presentation
Web sockets
Ad

Similar to Lezione 6: Remote Method Invocation (20)

PPT
Java lezione 14
PDF
Java Network Programming
PPT
2 Protocolli Applicativi
PDF
Sviluppo di servizi REST per Android - Luca Masini
PDF
SVILUPPO DI SERVIZI REST PER ANDROID
PDF
SIMarket_Massimo La Morgia
PPTX
Dal requisito all'implementazione @ CD2010
PDF
Tesi Todone
PDF
Web services
PDF
Shell Control Box - Il Gusto della Sicurezza
PDF
Lezione 3: Connessioni TCP
PDF
Reti e protocolli
PDF
1 Reti E Protocolli
PPTX
Reti di computer e protocolli
PDF
Spring e Flex
PDF
5 Protocolli Trasporto Parte1
PPT
PPT
Java lezione 9
Java lezione 14
Java Network Programming
2 Protocolli Applicativi
Sviluppo di servizi REST per Android - Luca Masini
SVILUPPO DI SERVIZI REST PER ANDROID
SIMarket_Massimo La Morgia
Dal requisito all'implementazione @ CD2010
Tesi Todone
Web services
Shell Control Box - Il Gusto della Sicurezza
Lezione 3: Connessioni TCP
Reti e protocolli
1 Reti E Protocolli
Reti di computer e protocolli
Spring e Flex
5 Protocolli Trasporto Parte1
Java lezione 9
Ad

More from Andrea Della Corte (10)

PDF
Lezione 7: Design Pattern Comportamentali
PDF
Lezione 4: I tool Ant e Subversion
PDF
Lezione 3: Sviluppo in Extreme Programming
PDF
Lezione 2: Pianificazione in Extreme Programming
PDF
Lezione 1: I metodi agili
PDF
Lezione 1: I/O in Java
PDF
Lezione 2: I thread
PDF
Lezione 4: Comunicazione con UDP
PPT
Tutorial Matlab 2009
PPT
Introduzione ai CRM
Lezione 7: Design Pattern Comportamentali
Lezione 4: I tool Ant e Subversion
Lezione 3: Sviluppo in Extreme Programming
Lezione 2: Pianificazione in Extreme Programming
Lezione 1: I metodi agili
Lezione 1: I/O in Java
Lezione 2: I thread
Lezione 4: Comunicazione con UDP
Tutorial Matlab 2009
Introduzione ai CRM

Recently uploaded (11)

PDF
Critico_o_creativo_Approcci_al_testo_let.pdf
PDF
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
PPTX
San Giovanni Eudes, 1601 – 1680, sacerdote e fondatore francese.pptx
PDF
Presentazione su educazione finanziaria e gestione della liquidità
PDF
PRESENTAZIONE PROGETTO CCCI IN ITALIANO .pdf
PDF
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
PDF
Presentazione di Chimica sui Coloranti Alimentari
PDF
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
PDF
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
PPTX
Santa Rosa da Lima, Vergine, Penitente, Terziaria Domenicana 1586-1617.pptx
PDF
Libro per insegnare di Balboni: Lingue_e_linguaggi.pdf
Critico_o_creativo_Approcci_al_testo_let.pdf
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
San Giovanni Eudes, 1601 – 1680, sacerdote e fondatore francese.pptx
Presentazione su educazione finanziaria e gestione della liquidità
PRESENTAZIONE PROGETTO CCCI IN ITALIANO .pdf
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
Presentazione di Chimica sui Coloranti Alimentari
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
NGÂN HÀNG CÂU HỎI TÁCH CHỌN LỌC THEO CHUYÊN ĐỀ TỪ ĐỀ THI THỬ TN THPT 2025 TIẾ...
Santa Rosa da Lima, Vergine, Penitente, Terziaria Domenicana 1586-1617.pptx
Libro per insegnare di Balboni: Lingue_e_linguaggi.pdf

Lezione 6: Remote Method Invocation

  • 1. Lezione 6: Remote Method Invocation Corso di Programmazione in Rete Laurea Magistrale in Ing. Informatica Università degli Studi di Salerno 1
  • 2. Outline ✦ Middleware ✦ Remote Method Invocation ✦ Definizione e uso di oggetti remoti 2
  • 3. Modelli distribuiti ✦ Molte applicazioni di rete possono essere realizzate usando un paradigma Client- Server • il client invia la richiesta di un’operazione a un server • il server elabora la richiesta • il server fornisce una risposta al client ✦ Esempi • Il protocollo HTTP per il World Wide Web • La posta elettronica • Il nostro sistema di chat 3
  • 4. Modelli distribuiti ✦ Java permette una gestione semplificata dei socket, con il quale il programmatore è in grado di realizzare un meccanismo di comunicazione. ✦ I socket risolvono solo il problema di fondo “come instaurare la connessione”, ma non definiscono le modalità di comunicazione. • codifica delle informazioni • estensibilità dei protocolli 4 • gestione efficiente delle connessioni
  • 5. Middleware ✦ Un middleware è uno strato di software che gestisce i meccanismi di comunicazione tra più processi, situati possibilmente su macchine diverse, presentando allo sviluppatore un’astrazione di livello più elevato, che gli consenta di ignorare una serie di problemi legati alla comunicazione • Semplicità di sviluppo • Indipendenza dagli specifici meccanismi di comunicazione 5
  • 6. Middleware Client Server Middleware Middleware Connessione Trasporto Trasporto 6
  • 7. Middleware ✦ Esistono delle forti analogie concettuali tra un sistema distribuito client-server e la programmazione orientata agli oggetti Invocazione metodo Oggetto Oggetto Risultato Richiesta Client Server Risposta ✦ I middleware object-oriented usano queste analogie per presentare allo sviluppatore un modello “familiare” 7
  • 8. Middleware ✦ In un middleware orientato agli oggetti, gli oggetti di un processo possono accedere ai servizi di un altro processo usando l’astrazione di oggetti remoti ✦ L’invocazione di metodi su oggetti remoti in realtà comporta la trasmissione di un messaggio al server che implementa tali oggetti, e l’attesa della risposta di tale server (comunicazione sincrona) 8
  • 9. Remote Method Invocation ✦ Gli oggetti remoti sono gestiti attraverso riferimenti (Remote Reference) che si comportano, dal punto di vista dello sviluppatore, come riferimenti a oggetti locali (o quasi). L’unica differenza è il modo con cui vengono ottenuti questi riferimenti. ✦ La soluzione full-Java per l’esecuzione di codice remoto è conosciuta con il nome di RMI (Remote Method Invocation) 9
  • 10. Architettura RMI ✦ quando un oggetto desidera invocare un metodo di un altro oggetto, deve prima ricavarne un riferimento (indirizzo), istanziandolo direttamente o ricevendone l’indirizzo dall’esterno, e successivamente eseguire un istruzione del tipo: nome_oggetto.nome_metodo(lista_parametri) 10
  • 11. Architettura RMI ✦ Nel caso distribuito si deve ricavare il riferimento all’oggetto remoto e invocare i metodi a distanza • la soluzione proposta da RMI consiste nello scaricare in locale un “rappresentante” dell’oggetto remoto e di considerarlo come se si trattasse a tutti gli effetti di un oggetto locale nome_ogg_remoto.nome_metodo(lista_parametri) 11
  • 12. Architettura RMI Lo strato più alto è costituito su entrambi i lati (client/server) dall’applicazione che viene eseguita sulla Java-Machine ✦ RMI Client ‣ applicazione che effettua le chiamate ai metodi degli oggetti remoti residenti sul lato server ✦ RMI Server ‣ Applicazione che gestisce gli oggetti serventi 12
  • 13. Architettura RMI …sotto il livello applicazione si trovano i due protagonisti di tutto il meccanismo RMI, lo stub e lo skeleton, due rappresentanti della stessa entità. Compiti dello stub sul client: Compiti dello skeleton sul • inizia una chiamata via RRL server: ‣ invia i parametri (serializzazione) • attende richieste • invoca il metodo via RRL • riceve i dati dal client ‣ attende il completamento dell’operazione ‣ deserializzazione dei parametri • completa la chiamata • chiama l’effettiva ‣ riceve e deserializza il risultato • ritorna implementazione del metodo • trasmette la risposta al client ‣ serializza il risultato 13
  • 14. Architettura RMI …i lati server e client sono collegati con il sottostante Remote Reference Layer (RRL) che a sua volta si appoggia al Transport Layer (TL)  Al livello RRL viene instaurato un collegamento virtuale fra i due lati, client e server, mentre fisicamente la connessione avviene al livello sottostante  (RRL) basato su protocollo generico ed indipendente dal particolare tipo di stub/skeleton 14
  • 15. Architettura RMI …i lati server e client sono collegati con il sottostante Remote Reference Layer (RRL) che a sua volta si appoggia al Transport Layer (TL)  Quando il TL riceve una richiesta di connessione da parte del client, localizza il server RMI relativo all’oggetto remoto richiesto:  localizzazione del server RMI  connessione per mezzo di un socket appositamente creato per il servizio  passa la connessione al lato client del RRL ed aggiunge un riferimento dell’oggetto remoto nella tabella opportuna  controllo dello stato delle connessioni (es. timeout) 15
  • 16. Architettura RMI RMI Client RMI Server Stub Skeleton Connessione virtuale RRL RRL TL TL socket socket TCP TCP IP IP Network Connessione fisica Network 16
  • 17. Definizione e uso di oggetti remoti ✦ I passi da seguire sono: • definire un’interfaccia remota • definire un’implementazione dell’interfaccia • creare un’applicazione server che istanzi l’implementazione e la renda pubblicamente accessibile • creare un client che ottenga un riferimento remoto e lo usi per richiedere le operazioni al server 17
  • 18. Interfaccia remota ✦ Per ogni oggetto che deve essere utilizzato come oggetto remoto occorre definire una interface detta interfaccia remota • l’interfaccia remota deve estendere Remote • ogni metodo deve dichiarare che può sollevare l’eccezione RemoteException • Sia Remote che RemoteException sono definite nel package java.rmi 18
  • 19. Interfaccia remota ✦ Esempio: • supponendo che l’oggetto remoto che vogliamo realizzare svolga le operazioni aritmetiche fondamentali import java.rmi.*; public interface Calculator extends Remote { double add(double a, double b) throws RemoteException; double subtract(double a, double b) throws RemoteException; double divide(double a, double b) throws RemoteException; double multiply(double a, double b) throws RemoteException; } 19
  • 20. Interfaccia remota ✦ I parametri e il valore di ritorno dei metodi dell’interfaccia remota possono appartenere solo a un insieme ristretto di tipi: • tipi atomici (es. int) • classi serializzabili • interfacce remote (anche diverse da quella che contiene il metodo) • array i cui elementi appartengono ai tipi sopraindicati 20
  • 21. Implementazione ✦ La classe che contiene l’effettiva implementazione dell’oggetto remoto: • deve essere derivata da java.rmi.server.UnicastRemoteObject • deve dichiarare che implementa l’interfaccia remota • inoltre deve avere un costruttore (anche vuoto) che dichiara di sollevare RemoteException ✦ Per convenzione, il nome della classe termina generalmente con “Impl” 21
  • 22. Implementazione ✦ Esempio import java.rmi.*; import java.rmi.server.*; public class CalculatorImpl extends UnicastRemoteObject implements Calculator { public CalculatorImpl() throws RemoteException { // Costruttore vuoto } public double add(double a, double b) { return a+b; } public double divide(double a, double b) { return a/b; } public double multiply(double a, double b) { return a*b; } public double subtract(double a, double b) { return a-b; } } 22
  • 23. Stub e skeleton ✦ Tradizionalmente, una volta definita la classe di implementazione, occorreva richiamare il tool rmic per effettuare la generazione dello stub e dello skeleton corrispondenti ✦ Da Java 1.2, lo skeleton viene generato dinamicamente in modo automatico ✦ Da Java 1.5, anche lo stub viene generato dinamicamente 23
  • 24. Applicazione server ✦ L’applicazione server ha il compito di: • creare una o più istanze delle classi che implementano le interfacce remote • rendere accessibili al client i riferimenti remoti a queste istanze ‣ come fa il client a ottenere un riferimento remoto dal server? 24
  • 25. Applicazione server ✦ Il modo principale con cui un client ottiene un remote reference è attraverso il valore di ritorno di un metodo remoto • se il client ha un riferimento a un oggetto remoto A, l’oggetto può fornirgli il riferimento a un altro oggetto remoto B, che a sua volta può fornirgli il riferimento a C e così via ✦ Problema: “bootstrap” • come fa il client a ottenere il riferimento al primo oggetto remoto? 25
  • 26. Registry ✦ Per risolvere il problema del bootstrap il Java Development Kit mette a disposizione l’applicazione rmiregistry • name server che associa nomi simbolici (o più precisamente URL) a riferimenti remoti • il server registra i riferimenti agli oggetti di bootstrap (quelli da cui il client deve partire per accedere all’applicazione) • il client consulta il name server usando un protocollo ad hoc (già implementato da una classe della libreria standard) 26
  • 27. Registrazione di un riferimento ✦ Occorre usare il metodo statico rebind della classe Naming: ‣ static void rebind(String name, Remote obj) throws RemoteException, MalformedURLException • name è il nome assegnato all’oggetto (parte finale dell’URL) • obj è l’istanza della classe di implementazione • l’oggetto viene registrato su un rmiregistry che si trova sulla stessa macchina 27
  • 28. Applicazione server ✦ Esempio import java.net.*; import java.rmi.*; public class CalculatorServer { public static void main(String args[]) throws RemoteException, MalformedURLException { Calculator calc=new CalculatorImpl(); Naming.rebind("calc", calc); } } 28
  • 29. Il client ✦ Il client ottiene un riferimento agli oggetti registrati usando il metodo lookup della classe Naming: • static Remote lookup(String url) throws NotBoundException, MalformedURLException, RemoteException ✦ Il formato dell’URL è: • rmi://host/name 29
  • 30. Il client ✦ Una volta ottenuto un riferimento (dal registry o da un altro oggetto remoto), il client lo usa come se fosse un oggetto “normale” • occorre ricordare che ogni metodo dell’interfaccia remota può sollevare un’eccezione controllata RemoteException 30
  • 31. Il client ✦ Esempio import java.net.*; import java.rmi.*; public class CalculatorClient { public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException { Calculator calc=(Calculator)Naming.lookup("rmi://localhost/calc"); System.out.print("9 per 9 fa "+calc.multiply(9,9)); } } 31