UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124



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

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193

Socket & RMI Ingegneria del Software - San Pietro

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

Programmazione di sistemi distribuiti

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:

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

Programmazione distribuita

RMI: metodi equals e hashcode

Parola chiave extends

Programmazione a Oggetti Lezione 10. Ereditarieta

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

Progettazione : Design Pattern Creazionali

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

RMI. Java RMI RMI. G. Prencipe

Modulo 4: Ereditarietà, interfacce e clonazione

Oggetti Lezione 3. aspetti generali e definizione di classi I

JNDI. Massimo Merro Programmazione di Rete 214 / 229

RMI Remote Method Invocation

Java Remote Method Invocation

Remote Method Invocation (RMI)

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

FPf per Windows 3.1. Guida all uso

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Esercitazione di Sistemi Distribuiti: Java RMI

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

Esempio: il conto bancario

appunti delle lezioni Architetture client/server: applicazioni client

Java: Compilatore e Interprete

appunti delle lezioni Architetture client/server: applicazioni server

Parte II: Reti di calcolatori Lezione 10

Multithreading in Java. Fondamenti di Sistemi Informativi

Introduzione. Java. Composizione. Esempio -- composizione. G. Prencipe È qualcosa che abbiamo già visto varie volte

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

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

Java Virtual Machine

Esercizi della lezione 5 di Java

Prova di Laboratorio di Programmazione

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

Telematica II 17. Esercitazione/Laboratorio 6

Approccio stratificato

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Test di unità con JUnit4

Realizzazione di una classe con un associazione

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

13. Chain of Responsibility

GESTIONE DEI PROCESSI

Nelle reti di calcolatori, le porte (traduzione impropria del termine. port inglese, che in realtà significa porto) sono lo strumento

ATTIVAZIONE SCHEDE ETHERNET PER STAMPANTI SATO SERIE ENHANCED

INTERNET e RETI di CALCOLATORI A.A. 2011/2012 Capitolo 4 DHCP Dynamic Host Configuration Protocol Fausto Marcantoni fausto.marcantoni@unicam.

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

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

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Lezione n.10 LPR- Informatica Applicata RMI CallBacks

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Ottava Esercitazione. introduzione ai thread java mutua esclusione

MODELLISTICA DI IMPIANTI E SISTEMI 2

Concetto di Funzione e Procedura METODI in Java

Altri tipi di connessione

Esercizio 1: trading on-line

Applicazioni distribuite

Algoritmi di Ricerca. Esempi di programmi Java

Inizializzazione, Assegnamento e Distruzione di Classi

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

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

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

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

Capitolo 4 Pianificazione e Sviluppo di Web Part

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Consiglio regionale della Toscana. Regole per il corretto funzionamento della posta elettronica

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Protezione. Protezione. Protezione. Obiettivi della protezione

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

Strutturazione logica dei dati: i file

Studi di Settore. Nota Operativa 22/4/2013

Sistema Informativo Gestione Fidelizzazione Clienti MANUALE D USO

Registratori di Cassa

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

Reti di Telecomunicazione Lezione 6

Le variabili. Olga Scotti

Programmazione di rete in Java

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

esercizi Esercizi / problemi

Libero Emergency PC. Sommario

Introduzione alle applicazioni di rete

1) GESTIONE DELLE POSTAZIONI REMOTE

1. RETI INFORMATICHE CORSO DI LAUREA IN INGEGNERIA INFORMATICA SPECIFICHE DI PROGETTO A.A. 2013/ Lato client

Transcript:

UnicastRemoteObject Java RMI fornisce diverse classi base per definire server remoti: UnicastRemoteObject < RemoteServer < RemoteObject dove A < B significa che A è una sottoclasse di B. UnicastRemotObject è una classe del package java.rmi.server ed è la classe più usata per implementare server remoti. UnicastRemoteObject supporta server remoti per comunicazioni point-to-point (e non broadcast o multipoint). IMPORTANTE: Referenze remote (stub) a server unicast sono valide solo fintantochè è in esecuzione il processo che ha creato l oggetto remoto. Ricordiamo che la realizzazione di un server remoto richiede sostanzialmente tre passi: Implementazione di una o più interfacce remote Definizione di una classe che modelli il comportamento del server Esportazione di un istanza di tale classe. Massimo Merro Programmazione di Rete 103 / 124

Esistono tre modi per definire un server remoto unicast: 1) Estendendo UnicastRemoteObject: public class ServerRemoto extends UnicastRemoteObject implement IntRemota { public ServerRemoto() throws RemoteException { super(); // E qui che il server viene esportato...}... public void main(string[] args){ ServerRemoto server = new ServerRemoto(); Naming.bind( MioServer,server); } } Il codice di lancio di questo server si occupa solo di (i) creare un istanza del server remoto e di (ii) registrare una referenza remota del server nel registro RMI. Un server unicast viene esportato automaticamente al momento della costruzione, ovvero quando viene invocato il suo costruttore. Al momento dell esportazione il server viene registrato col sistema RMI e messo in ascolto su una porta TCP. Massimo Merro Programmazione di Rete 104 / 124

UnicastRemoteObject ha tre possibili costruttori: protected UnicastRemoteObject() protected UnicastRemoteObject(int port) protected UnicastRemoteObject(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) Il primo costruttore crea ed esporta un nuovo oggetto unicast usando una porta anonima, ovvero una porta scelta dal sistema RMI; per economizzare risorse, il sistema RMI potrebbe usare una porta già in uso presso un altro server riutilizzando il medesimo server socket. Il secondo ed il terzo costruttore specificano la porta su cui si vuole lanciare il server. Il terzo costruttore specifica anche i socket da usare, lato client e lato server. Quando il costruttore UnicastRemoteObject() ritorna, il server remoto è già in ascolto sulla porta. Massimo Merro Programmazione di Rete 105 / 124

Poichè il server viene esportato automaticamente al momento della costruzione, ne consegue che i costruttori devono poter lanciare RemoteException. Discorso simile vale per i costruttori di quegli oggetti che estendono UnicastRemoteObject. Un server che estende UnicastRemoteObject eredita la semantica per server remoti di RemoteObject. Mentre la semantica per cloning e serializzazione viene ereditata da UnicastRemoteObject. Più precisamente UnicastRemoteObject implementa il metodo Object.clone clonando l intero stato del server remoto ed esportandolo sulla stessa porta dell oggetto originale utilizzando però un altro socket. Comunque, la classe non implementa l interfaccia Cloneable, questo è lasciato alle sottoclassi. Massimo Merro Programmazione di Rete 106 / 124

I due vantaggi principali di UnicastRemoteObject sono: 1 La connessione automatica al meccanismo di runtime di RMI per quanto riguarda esportazione (e de-esportazione). 2 Una semantica appropriata per testare l uguaglianza di server remoti. D altrocanto definire un server remoto estendendo direttamente UnicastRemoteObject può essere causa di due tipi di problemi: 1 In Java è consentito estendere una sola classe, e quindi il server in questione non può estendere altre classi. 2 Il server remoto potrebbe essere esposto ad invocazioni remote premature, visto che l esportazione avviene nel momento stesso della creazione. Massimo Merro Programmazione di Rete 107 / 124

Un altro modo per definire server remoti è quello di estendere una classe tra RemoteServer o RemoteObject al posto di UnicastRemoteObject. Ad esempio: public class ServerRemoto extends RemoteServer // oppure RemoteObject implements IntRemota { public ServerRemoto() throws RemoteException {... }... public void main(string[] args){ ServerRemoto obj = new ServerRemoto();... RemoteStub stub = UnicastRemoteObject.exportObject(obj); Naming.bind( MioServer,stub); } } Vediamo un po meglio queste due classi base. Massimo Merro Programmazione di Rete 108 / 124

RemoteObject java.rmi.server.remoteobject fornisce la semantica per oggetti remoti, siano essi server o stub, riscrivendo opportunamente i metodi hashcode, equals, tostring (RemoteStub < RemoteObject). I primi due metodi sono implementati per consentire a referenze di RemoteObject di essere memorizzate in tabelle hash ed essere confrontate: Il metodo equals ritorna true se due RemoteObjects sono referenze allo stesso server remoto. Nota che l uguaglianza non è testata confrontando il contenuto dei server remoti perchè ciò richiederebbe due invocazioni remote con relativo trattamento delle RemoteException. Il metodo hashcode ritorna lo stesso valore per tutte le referenze remote che puntano allo stesso RemoteObject. Il metodo tostring ritorna una rappresentazione sotto forma di stringa dell oggetto remoto. Massimo Merro Programmazione di Rete 109 / 124

RemoteServer java.rmi.server.remoteserver è una classe astratta per UnicastRemoteObject e Activatable. Tra l altro, fornisce i metodi statici getclienthost e getlog con la seguente segnatura: public static String getclienthost() throws ServerNotActiveException public static PrintStream getlog() Il primo mtodo torna l hostname del client corrente. Il secondo metodo fornisce uno stream con i log al server remoto. Il comportamento dell operazione di clonazione deve essere definita dal programmatore. Indipendentemente dall uso di RemoteObject o RemoteServer, il codice di lancio è differente rispetto al caso in cui si estende UnicastRemoteObject. Massimo Merro Programmazione di Rete 110 / 124

La creazione del server remoto non comporta l esportazione automatica del server. Invece è necessario invocare il metodo statico UnicastRemoteObject.exportObject che si occupa di esportare il server remoto. Esistono tre forme dello stesso metodo: static RemoteStub exportobject(remote obj) static Remote exportobject(remote obj, int port) static Remote exportobject(remote obj, int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) Contrariamente a quanto potrebbe sembrare dalla segnatura, questi metodi ritornano tutti RemoteStub che possono essere passati come parametro per la bind (o rebind). IMPORTANTE: Il metodo exportobject può essere invocato dall oggetto stesso, da chi ha costruito l oggetto, oppure da chi l ha ricevuto in una comunicazione locale. Massimo Merro Programmazione di Rete 111 / 124

3) Infine è possibile creare una classe remota senza estendere nessuna delle classi menzionate prima; ma eventualmente estendendo la classe che si preferisce. Ad esempio: public class ServerRemoto extends MiaClasse implement IntRemota { public ServerRemoto() throws RemoteException {...}... public void main(string[] args){ ServerRemoto obj = new ServerRemoto();... RemoteStub stub = UnicastRemoteObject.exportObject(obj); Naming.bind( MioServer,stub); } } La semantica di tali server, così come il comportamento per la clonazione, è demandata completamente al programmatore. Il meccanismo di esportazione è invariato. Inoltre poichè non stiamo estendendo RemoteObject il programmatore della classe remota deve prendersi cura di reimplementare i metodi hashcode, equals, e tostring, ereditati dalla classe Object, in maniera appropriata per oggetti remoti. Massimo Merro Programmazione di Rete 112 / 124

La riscrittura di tali metodi non richiede molto codice. Essenzialmente bisogna preoccuparsi di tre cose: l host su cui è in esecuzione il server; l identità della JVM che esegue il server; l identità dell oggetto server all interno della JVM. Come detto precedentemente se un server estende UnicastRemoteObject allora non può estendere altre classi. Quest inconveniente può essere agevolmente aggirato spezzando il server in due: 1 Un server remoto che estenda UnicastRemoteObject ed implementi l interfaccia remota. Tale implementazione inoltra tutte le richieste ad un secondo server (il vero server). 2 Un secondo server (che eventualmente estende una qualche classe) che implementi anch essa l interfaccia remota. Tale server riceverà le richieste dal primo server utilizzando eventualmente anche metodi della superclasse. Massimo Merro Programmazione di Rete 113 / 124

Una seconda potenziale limitazione dei server unicast è che possono prematuramente ricevere richieste remote. Ad esempio: public class PrintManager_Impl extends UnicastRemoteObject implements PrinterManager{ public PrintManager_Impl(){ super(5150); // porta usuale per print managers. // trova tutte le stampanti registrate // ottieni la referenza di ciascuna stampante, // e ottieni le informazioni sulle loro code // cosi da consentire agli utenti di ricavare // informazioni su tutte le stampanti. L oggetto è esportato subito dopo aver invocato super(5150), ovvero il costruttore di UnicastRemoteObject. A tal punto il server potrebbe ricevere invocazioni remote prima che il costruttore abbia terminato il set-up. Massimo Merro Programmazione di Rete 114 / 124

De-esportazione Un server remoto viene de-esportato quando viene de-registrato dal sistema RMI (non dal registro RMI!) Un server remoto è automaticamente de-esportato quando viene rimosso dal garbage collector locale. Un server remoto può essere rimosso dal garbage collector locale solo se: 1 Le referenze remote esistenti (presso i clients) sono sono state a loro volta rimosse dal garbage collector delle rispettive JVM. 2 Non esistono referenze locali al server. Di norma si preferisce la de-esportazione automatica, ma in alcuni casi può essere desiderabile forzare la de-esportazione di un server (Ad esempio, se il server è sotto attacco). Massimo Merro Programmazione di Rete 115 / 124

La de-esportazione può essere forzata con il metodo UnicastRemoteObject.unexport() con la seguente segnatura: public static boolean unexportobject(remote obj, boolean force) throws NoSuchObjectException. Se il parametro force è messo a true allora la de-esportazione viene forzata brutalmente anche durante un invocazione remota al server. L eccezione NoSuchObjectException viene lanciato se l oggetto non è correntemente esportato. Massimo Merro Programmazione di Rete 116 / 124

Threads, Sockets, e Porte Durante l esportazione di un server remoto avvengono un certo numero di cose: Viene creato un ServerSocket su una porta TCP che ascolta ed accetta invocazioni al server su quella porta. Quando il Server socket accetta una richiesta da parte di un client stabilisce una connessione via socket con questi. Una volta stabilita la connessione socket col cliente, le invocazioni RMI vengono inoltrate verso il server (ed il metodo in questione) su un thread determinato dall implementazione. Importante: Facendo riferimento alla specifica della sun: invocazioni diverse ad un medesimo server remoto possono essere eseguite nello stesso thread oppure in thread differenti. Si noti che all esportazione di un server, il sistema RMI creerà un nuovo Server socket, su una nuova porta TCP, solo se necessario. Se possibile, al fine di economizzare risorse, il sistema RMI tenterà di utilizzare un Server socket già in uso. Massimo Merro Programmazione di Rete 117 / 124

Tale condivisione è possibile purchè i due server siano stati esportati dallo stesso host e dalla stessa JVM con: Numero di porta omesso, oppure uguale a 0, oppure con lo stesso numero di porta. Client socket factory omesso, nullo, o uguale. Server socket factory omesso, nullo, o uguale. Si noti che in generale, a meno della presenza di firewalls, i server remoti vengono esportati attraverso una porta individuata dal sistema RMI. È strettamente necessario avere più porte TCP/IP solo quando un host ha in esecuzione più servers su JVM differenti. Un client può usare la medesima connessione socket per accedere un secondo server remoto purchè questi sia stato esportato dallo stesso host del primo con: Numero di porta omessa, oppure uguale a zero, oppure con lo stesso numero di porta. Client Socket Factory omessa, oppure nulla, oppure uguale socket factory Massimo Merro Programmazione di Rete 118 / 124

Server remoti esportati, pur se serializzabili, vengono passati per referenza remota (si passa lo stub). Indipendentemente dal fatto che il server remoto estenda o meno UnicastRemoteObject. Se però un server unicast serializzabile viene passato dopo essere stato de-esportato allora il passaggio avviene attraverso il processo di serializzazione che, oltre a memorizzare lo stato del server, memorizza anche la porta usata dal server ed i socket utilizzati. Il ricevente, al momento della deserializzazione riceverà il server unicast e lo esporterà automaticamente sulla porta passata utilizzando i medesimi socket. Questa procedura consente il salvataggio di server RMI su file ed anche mobilità di codice. Massimo Merro Programmazione di Rete 119 / 124