Java lezione 14
-
Upload
sergio-ronchi -
Category
Software
-
view
101 -
download
2
Transcript of Java lezione 14
![Page 1: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/1.jpg)
Applicazioni Distribuite
Permettono di ottimizzare l’uso delle risorse in una rete. Sono realizzate attraverso architetture client-server su tre livelli: (Interfaccia, elaborazione, archiviazione)
![Page 2: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/2.jpg)
DCOM e il modo Microsoft (Distributed Component Object Model).COM è un’istanza di una classe su un server a cui si può accedere solo
attraverso i metodi. DCOM permette agli oggetti COM in esecuzione su un computer di creare altri oggetti COM su un’altra macchina. Gli oggetti remoti vengono poi usati come oggetti locali.
In Windows tutte le classi sono registrate nel registro di sistema, quindi lo devono essere anche gli oggetti remoti. Gli oggetti remoti comunicano tra loro attraverso un meccanismo RPC (Remote Procedure Call) che poggia sul protocollo UDP o sul protocollo TCP. Inoltre DCOM prevede un’elevata gestione della sicurezza.
L’SDK Java di Microsoft consente l’utilizzo di DCOM.
![Page 3: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/3.jpg)
CORBA(Common Object Request Broker Architecture).CORBA è simile DCOM object oriented, ma è uno standard aperto. Un oggetto
client può utilizzare i metodi di un oggetto server attraverso ORB.L’interfaccia tra ORB e i due lati della comunicazione passa attraverso un IDL
(Interface Definition Language) indipendente dal linguaggio di implementazione.L’oggetto client richiama in realtà un oggetto dello Stub IDL corrispondente al
metodo remoto.
Server Obj Client Obj
Stub IDL Model IDL
ORB
![Page 4: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/4.jpg)
SOAP(Simple Object Access Protocol)Nonostante il SOAP sia un’ innovazione per le comunicazioni, non introduce nuovi
concetti in quanto si basa su tecnologia gia esistente e funzionante, e utilizza per il trasporto dei messaggi di richiesta/risposta il protocollo HTTP nel quale i parametri e i comandi sono codificati con XML; inquesto modo si riesce a eliminare il problema della differenza di piattaforma, in quanto XML hauna tecnologia Web estremamente flessibile ed estensibile.
Server Obj Client Obj
XML XML
HTTP
![Page 5: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/5.jpg)
Esempio richiesta SOAP
POST /StockQuote HTTP/1:1Host: www.stockquoteserver.comContent-Type: text/xml; charset=”utf-8”Content-Lenght: nnnnSOAPAction: “Some-URI”<SOAP-ENV:Envelope>xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/”SOAP-ENV:encodingStyle=http://schemas.xmlsoap.org/soap/encoding/>
<SOAP-ENV:Body><m:GetLastTradePrice xmlns:m=”Some-URI”><symbol>DIS</symbol><m:GetLastTradePrice>
</SOAP-ENV:Body></SOAP-ENV:Envelope>
![Page 6: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/6.jpg)
Esempio risposta SOAP
HTTP/1.1 200 OKContent-Type: Text/xml; charset=”utf-8”Content-Lenght: nnnn<SOAP-ENV:Envelope>xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/”SOAP-ENV:encodingStyle=http://schemas.xmlsoap.org/soap/encoding/>
<SOAP-ENV:Body><m:GetLastTradePriceResponse xmlns:m=”Some-URI”><Price>1000$</Price></m:GetLastTradePriceResponse>
</SOAP-ENV:Body></SOAP-ENV:Envelope>
![Page 7: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/7.jpg)
Java RMI(Remote Method Invocation).E’ una tecnologia tutta Sun che tuttavia possiede tutti i benefici di CORBA.Anche in RMI si ha dal lato Client uno STUB che funge da Proxy per gli oggetti
remoti. Rispetto a CORBA non si ha però IDL e ORB, che invee garantivano con CORBA l’indipendenza dal linguaggio.
A livello di trasporto RMI utilizza un normale socket TCP.Sul server gli oggetti devono essere registrati in un registro che deve essere
lasciato in esecuzione .MarshalizzazioneTutti gli oggetti che viaggiano su uno stream devono essere serializzati, questo
vale ovviamente anche per gli eventuali parametri passati ai metodi e per i valori di ritorno. Ma anche i dati numerici o primitivi devono sempre possedere un formato adatto al trasporto da una JVM all’altra.
![Page 8: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/8.jpg)
1- Impostazioni server (interfaccia)
Il client deve in qualche modo disporre degli oggetti remoti. Si crea a tale scopo una interfaccia che come noto non contiene alcuna implementazione, ma permette di definire un ‘prototipo’
import java.rmi.*;public interface Product extends Remote //sia sul client che sul server{ public String getDescription() throws RemoteException;}
Si noti che viene estesa la classe Remote e che il metodo remoto lancia un eccezione RemoteException (ad esempio la connessione potrebbe cadere)
![Page 9: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/9.jpg)
2-Impostazioni server Implementazione
Implementiamo il metodo che restituirà il risultatoimport java.rmi.*;import java.rmi.server.*;public class ProductImpl extends UnicastRemoteObject implements Product { public String getDescription() throws RemoteException { return name;}
/***********************************************/public ProductImpl(String n) throws RemoteException{ name=n;}/***********************************************/private String name;
}
Si noti che viene estesa la classe UnicastRemoteObject
![Page 10: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/10.jpg)
3-Impostazioni server classe Server
Infine è necessario istanziare e registrare gli oggetti sul serverimport java.rmi.*;import java.rmi.server.*;public class ProductServer {
public static void main(String args[]){ try {ProductImpl p1=new ProductImpl(“Lavatrice REX”);ProductImpl p2=new ProductImpl(“Forno Ariston”);Naming.rebind(“lavatrice”,p1);Naming.rebind(“forno”,p2); }catch(Exception e){ e.printStackTrace();}
} }
Si noti soprattutto la registrazione degli oggetti attraverso un nome.
![Page 11: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/11.jpg)
4-Impostazioni server Avvio
Innanzi tutto è opportuno settare il CLASSPATH in modo che contenga la directory dove si troveranno le classi compilate.
Set classpath=c:\rmi\prodottiCompilate tutte le classi javac *.javaè necessario creare lo stub rmic –v1.2 ProductImpl
avviare quindi il registro RMIstart rmiregistry(in UNIX rmiregistry &)
Quindi avviare la nostra applicazione come serviziostart java ProductServer(in UNIX java ProductServer &)
![Page 12: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/12.jpg)
1-Impostazioni client Avvio
Sul client dovrà risiedere l’interfaccia Product, lo Stub e la classe ProductClient.import java.rmi.*;import java.rmi.server.*;public class ProductClient{ public static void main(String[] args) { System.setProperty("java.security.policy", "client.policy"); System.setSecurityManager(new RMISecurityManager()); String url = "rmi://localhost/"; try { Product c1 = (Product)Naming.lookup(url + “lavatrice"); Product c2 = (Product)Naming.lookup(url + “forno"); System.out.println(c1.getDescription()); System.out.println(c2.getDescription()); } catch(Exception e) { e.printStackTrace(); } }}Si noti in particolare il gestore della sicurezza e l’uso del metodo remoto.Esecuzione: java ProductClient
![Page 13: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/13.jpg)
1-Impostazioni client file client.policygrant { permission java.net.SocketPermission "*:1024-65535", "connect,accept"; permission java.net.SocketPermission "localhost:8080", "connect";};
![Page 14: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/14.jpg)
Installazione Client-ServerPreparare 3 directory:Server
(Product.class, ProductImpl.class,ProductServer.class,PuductImpl_Stub.class)download
(Product.class, PuductImpl_Stub.class)Client
(Product.class, ProductClient.class,client.policy)
La directory download dovrà essere una directory pubblica del server web. Ad esempio se si usa Tomcat conviene spostarla all’interno della cartella webapps, quindi copiare al suo interno la cartella WEB-INF prelevata dalla cartella ROOT.Si verifichi poi dal browser scrivendo http://localhost:8080/download
![Page 15: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/15.jpg)
Avvio Server – Test del ClientAvviare rmiregistry da una shell, non dalla directory server.
Spostarsi nella directory server ed avviare ProductSreverstart java –Djava.rmi.server.codebase=http://localhost:8080/download/ ProductServer
Avviare il client dalla cartella Clientjava ProductClient
Se tutto funziona saremo pronti per l’installazione reale su due macchineRicordarsi però di cambiare sul client l’indirizzo del server sia nel sorgente di
ProductClient sia nel file di policy
![Page 16: Java lezione 14](https://reader036.fdocumenti.com/reader036/viewer/2022082906/58e63a3e1a28abe3108b4d73/html5/thumbnails/16.jpg)
EsercizioServer: realizzare una classe denominata Corso che, oltre ad altri attributi contiene un elenco di studenti. Con i metodi:
Studente getStudente(String codice)TreeSet getLista()
Client: ha un’interfaccia grafica
-inserire il codice studente e mi visualizza tutte le informazioni dello studente premendo ‘Cerca’- premendo ‘Lista’ mostra la lista completa e ordinata degli studenti