7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:



Похожие документы
Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

RMI. Java RMI RMI. G. Prencipe

Introduzione a Java Remote Method Invocation (RMI)

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

Lezione n.10 LPR- Informatica Applicata RMI CallBacks

Java Remote Method Invocation

Esercizi su Java RMI. Progetto di Cliente / Servitore e supporto. Possibile tabella mantenuta dal server

Organizzazione della lezione. 15. Java Remote Method Invocation (3) Lo schema del Factory Design Pattern - 1. Factory design pattern

Programmazione di sistemi distribuiti

RMI Remote Method Invocation

Registri RMI. Massimo Merro Univ. Verona Programmazione di Rete 90 / 247

Corso di Reti di Calcolatori L-A

Esercitazione di Sistemi Distribuiti: Java RMI

Programmazione distribuita

Activation In sintesi: è inutile avere attivi degli oggetti se non vengono utilizzati

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

RMI: metodi equals e hashcode

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

RMI e Firewall. Una soluzione è offerta dal transport layer di RMI stesso

Socket & RMI Ingegneria del Software - San Pietro

Contesto e motivazioni Architettura e concetti di base Componenti di RMI RMIRegistry Interfacce, eccezioni e classi Lo sviluppo di una applicazione L

Main System Monitor Keyboard

Parte II: Reti di calcolatori Lezione 10

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

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

Java RMI (Remote Method Invocation)

Comunicazione fra oggetti distribuiti

Mobilità di Codice. Massimo Merro Programmazione di Rete 128 / 144

appunti delle lezioni Architetture client/server: applicazioni server

Prova d Esame Compito A

Remote Method Invocation (RMI)

Java RMI: Esempio Completo di un Applicazione Distribuita

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

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

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

Architettura Client-Server

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193

appunti delle lezioni Architetture client/server: applicazioni client

Programmazione di rete in Java

Programmare con le Socket TCP

Sistemi Distribuiti Multiagente A.A Informatica Magistrale Università di Bari

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

Sistemi Distribuiti. Anno Accademico Prof. Flavio De Paoli. Il modello ad oggetti

Esercizi della lezione 5 di Java

13. Chain of Responsibility

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

Programmare con le Socket

Corso di programmazione di sistemi mobile 1. Android. Google Cloud Messaging

GESTIONE DEI PROCESSI

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

Client e Server comunicano tramite il protocollo SOAP.

Realizzazione di una classe con un associazione

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

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

Gli EJB offrono vari vantaggi allo sviluppatore di una applicazione

Gestione delle Eccezioni

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Un esercizio d esame. Flavio De Paoli

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

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

Транскрипт:

7 Esercitazione (svolta): due possibilità: Java RMI: callback Molte applicazioni richiedono un meccanismo publish/subscribe I partecipanti (client) necessitano di notifiche da parte del coordinatore (server) Polling Callback (1) (2) Reti di calcolatori L-A Esercitazione n 7 svolta - 1 Reti di calcolatori L-A Esercitazione n 7 svolta - 2

Callback con Java RMI Callback: meccanismo che permette ad un client di essere notificato dal server al verificarsi dell evento per cui si è registrato e messo in attesa. Notifica del server = Stub Invocazione di un metodo remoto del client Invocazione di metodi remoti bidirezionale lookup Skeleton Remote Reference Layer RMI Registry Transport Layer bind Skeleton (1) (4) (2) (3) Stub Remote Reference Layer Come realizzare la callback Lato client: bisogna fornire il metodo remoto che il server deve invocare per fare la callback 1. definire l interfaccia remota del client, in cui viene dichiarato il metodo di callback invocato dal server 2. implementare l interfaccia remota del client, ovvero implementare il metodo di callback 3. istanziare l implementazione dell interfaccia remota del client e passarla al server che la utilizzarà per invocare il metodo remoto di callback Lato server: bisogna mantenere un riferimento al client su cui fare la callback 1. definire l interfaccia remota del server, come sempre, in particolare è necessario definire il metodo di de/registrazione che il client invoca per inviare al server il proprio riferimento remoto 2. implementare l interfaccia remota del server 3. istanziare l implementazione dell interfaccia remota del server e pubblicarla sul registry Reti di calcolatori L-A Esercitazione n 7 svolta - 3 Reti di calcolatori L-A Esercitazione n 7 svolta - 4

Esercizio: Chat Realizzare un applicazione che implementi una chat, in cui: Implementazione del client: Definizione dell interfaccia remota del client: public interface ChatInterface extends java.rmi.remote{ i client si registrano, mandano messaggi fino all inserimento dell EOF da tastiera, infine si cancellano e terminano; public String name() public void callback(string who_what) il server tiene traccia dei client registrati, per ogni nuova registrazione notifica a tutti i presenti nella room il nuovo ingresso, per ogni messaggio ricevuto notifica a tutti i presenti il messaggio con il mittente, per ogni uscita notifica a tutti i presenti l uscita. Ogni notifica viene effettuata invocando una callback. Implementazione dell interfaccia remota del client: public class ChatImpl extends UnicastRemoteObject implements ChatInterface { String my_name; public ChatImpl(String name) throws RemoteException { my_name=name; public String name() throws java.rmi.remoteexception { return my_name; public void callback(string who_what) throws java.rmi.remoteexception { who_what); Reti di calcolatori L-A Esercitazione n 7 svolta - 5 Reti di calcolatori L-A Esercitazione n 7 svolta - 6

Programma client: Creazione di una istanza di ChatImpl, che viene poi passata per riferimento remoto al server; il server utilizzerà tale riferimento per invocare il metodo remoto di callback: public class Chat { public static void main(string args[]) { String hostname = null; int RMIPort = -1; /* controllo argomenti (vedi sorgenti)... */ try { InputStreamReader is = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(is); String registryurl = "rmi://" +hostname+ ":" +portnum+"/chat"; /* recupero riferimento al server */ ChatInterface server_ref = (ChatInterface)Naming. lookup(registryurl); "Lookup completed " ); /* creazione istanza del client */ "What is your name?"); String name = br.readline(); ChatImpl client_ref = new ChatImpl(name); /* registrazione client-->ingresso chat room */ "Registering for chat"); server_ref.register(client_ref); /* ciclo di permanenza nella chat room */ "Enter messages, EOF to exit "); String message; while((message=br.readline())!=null){ server_ref.saysomething(message, client_ref); /* uscita dalla chat */ server_ref.unregister(client_ref); "Unregistered from chat."); System.exit(0); // end try catch (Exception e) { "Exception in Chat: " + e); System.exit(1); // end catch //end main //end class Reti di calcolatori L-A Esercitazione n 7 svolta - 7 Reti di calcolatori L-A Esercitazione n 7 svolta - 8

Implementazione del server: Definizione dell interfaccia remota del server; si noti che sono presenti sia il metodo per la de/registrazione dei client, sia il metodo per la pubblicazione dei messaggi: public interface ChatInterface extends Remote { public void register( public void saysomething(string message, public void unregister( Implementazione dell interfaccia remota del server: public class ChatImpl extends UnicastRemoteObject implements ChatInterface { private Vector clientlist; public ChatImpl() throws RemoteException { super( ); clientlist = new Vector(); /* metodo di registrazione: inserisce in una lista il client che vuole registrarsi */ public synchronized void register( if (!(clientlist.contains(client_ref))) { clientlist.addelement(client_ref); "Registered new client "); String callback_msg = "Entrance of "+client_ref.name()+"\n"; docallbacks(callback_msg); // end if else { "register: client already registered."); // else // end register /* metodo di invio di un messaggio */ public void saysomething(string message, throws java.rmi.remoteexception{ String callback_msg = client_ref.name()+ : +message+ \n ; docallbacks(callback_msg); // end saysomething Reti di calcolatori L-A Esercitazione n 7 svolta - 9 Reti di calcolatori L-A Esercitazione n 7 svolta - 10

/* metodo di cancellazione: elimina dalla lista il client che vuole cancellarsi */ public synchronized void unregister( if(clientlist.removeelement(client_ref)) { "Unregistered client "); String callback_msg = Exit of +client_ref.name()+ \n ; docallbacks(callback_msg); else { "unregister: client wasn't registered."); // end unregister /* metodo che fa la callback a tutti i client registrati */ private synchronized void docallbacks (String msg) "***** Callbacks execution *****\n"); for (int i = 0; i < clientlist.size(); i++){ ChatInterface next = (ChatInterface)clientList.elementAt(i); next.callback(msg); // end for // end docallbacks // end server class Programma server: Creazione e pubblicazione presso il registry di una istanza di ChatImpl: public class Chat { public static void main(string args[]) { InputStreamReader is = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(is); String registryurl; int RMIPortNum = -1; /* controllo argomenti (vedi sorgenti)... */ try{ startregistry(rmiportnum); /* istanziazione del server e pubblicazione sul registry */ ChatImpl server_ref = new ChatImpl(); registryurl = "rmi://localhost:"+ portnum +"/chat"; Naming.rebind(registryURL, server_ref); "Chat ready."); // end try catch (Exception re) { "Exception in Chat.main: "+re); System.exit(1); // end catch // end main Reti di calcolatori L-A Esercitazione n 7 svolta - 11 Reti di calcolatori L-A Esercitazione n 7 svolta - 12

/* metodo che verifica se c è già un registry attivo sull host e porta indicati, e se non c è lo crea */ private static void startregistry(int RMIPortNum) try { Registry registry = LocateRegistry.getRegistry(RMIPortNum); registry.list( ); catch (RemoteException e) { Registry registry = LocateRegistry.createRegistry(RMIPortNum); // end startregistry // end class Implementazione di LocateRegistry.getRegistry(String): public static Registry getregistry (String host) Registry registry = (Registry) sun.rmi.server.remoteproxy. getstub("sun.rmi.registry.registryimpl", ObjID.REGISTRY_ID, host, port); return registry; Implementazione di LocateRegistry.createRegistry(RMIPortNum) public static Registry createregistry(int port) return new sun.rmi.registry.registryimpl(port); Compilazione: Compilazione delle interfacce remote: javac ChatInterface.java javac ChatInterface.java Compilazione delle implementazioni delle interfacce, del client e del server: javac ChatImpl.java javac ChatImpl.java javac Chat.java javac Chat.java Compilazione con l rmi compiler delle implementazioni delle interfacce remote (N.B.: sia del server che del client!): rmic ChatImpl rmic ChatImpl per generare stub e skeleton: ChatImpl_Skel ChatImpl_Stub ChatImpl_Skel ChatImpl_Stub Reti di calcolatori L-A Esercitazione n 7 svolta - 13 Reti di calcolatori L-A Esercitazione n 7 svolta - 14