Socket & RMI Ingegneria del Software - San Pietro
Socket È possibile trattare la comunicazione di rete allo stesso modo con cui è possibile trattare la lettura da file. La classe Socket rappresenta la connessione stabilita.
Socket Il socket è identificato dalle coppie di IP e porta. Vi sono 2 protocolli di comunicazione: TCP - Transmission Control Protocol UDP - User Datagram Protocol
Socket TCP Socket ServerSocket Client Server Socket
Socket UDP Socket Socket Client Server
Caratteristiche Il protocollo TCP è: Orientato alla connessione Controlla eventuali errori, congestione e flusso di comunicazione Normalmente userete sempre TCP A meno che non abbiate problemi di latenza (es. streaming audio/video)
Lato client Basta creare un oggetto Socket passando l hostname e la porta Si utilizza il socket come un normale I/O I metodi getinputstream e getoutputstream ritornano gli stream di ingresso/uscita associati al socket Alla fine si chiude il socket col metodo close 1 import java.net.socket; 2 3 //... 4 Socket socket; 5 socket = new Socket(host, port); 6 OutputStream os = socket.getoutputstream(); 7 InputStream reader = socket.getinputstream(); 8 //... 9 socket.close();
Esercizio Si implementi un client HTTP
Lato server Si crea un oggetto ServerSocket passando la porta Il metodo accept ritorna l oggetto Socket relativo al client che si connette Alla fine si chiude il socket col metodo close 1 import java.net.serversocket; 2 import java.net.socket; 3 4 //... 5 ServerSocket serversocket = new ServerSocket(port); 6 Socket connection = serversocket.accept(); 7 //... 8 connection.close(); 9 serversocket.close();
Chiusura socket Il metodo close chiuderà un socket aperto Eventuali operazioni in corso verranno interrotte con una IOException ServerSocket e Socket hanno un metodo isclosed che restituisce true se il socket è stato chiuso
Remarks I metodi visti finora sono bloccanti! Garantiscono la riuscita/fallimento dell operazione richiesta quanto ritornano Possono però introdurre ritardi
Esercizio Si implementi un server daytime
RMI middleware per applicare la programmazione orientata agli oggetti nel contesto distribuito Concetto di oggetto remoto: oggetto il cui riferimento è disponibile su una JVM diversa da quella in cui risiede l oggetto. Possono essere invocati metodi su oggetti remoti, per i quali si ottiene un riferimento remoto passaggio dei parametri per valore per oggetti non remoti passaggio dei parametri per indirizzo per oggetti remoti possibilità di scaricare (download) automaticamente le classi necessarie per la valutazione remota
Uso tipico Server crea oggetti remoti, li rende visibili e attende che i client invochino metodi su di essi Client ottiene riferimenti a oggetti remoti e invoca metodi su di essi
Funzionalità Localizzazione di oggetti remoti Gli oggetti remoti sono registrati presso un registro di nomi (rmiregistry) Le operazioni passano come parametri e/o restituiscono riferimenti a oggetti remoti Comunicazione con oggetti remoti gestita da RMI, per i programmi accedere a oggetti remoti non fa differenza rispetto agli oggetti "normali" Dynamic class loading essendo possibile passare oggetti ai metodi di oggetti remoti, oltre a trasmettere i valori dei parametri, RMI consente di trasferire il codice degli oggetti a run time (potrebbe trattarsi di un nuovo sottotipo)
Definizioni Oggetto remoto: oggetto i cui metodi possono essere invocati da una Java Virtual Machine diversa da quella in cui l oggetto risiede Interfaccia remota: interfaccia che dichiara quali sono i metodi che possono essere invocati da una diversa Java Virtual Machine Server: insieme di uno o più oggetti remoti che, implementando una o più interfacce remote, offrono delle risorse (dati e/o procedure) a macchine esterne distribuite sulla rete Remote Method Invocation: invocazione di un metodo presente in una interfaccia remota implementata da un oggetto remoto. La sintassi di una invocazione remota è identica a quella locale
Registry È un programma di rete che ascolta su una porta, di default la 1099. Può essere creato tramite il metodo LocateRegistry.createRegistry Alternativamente si può eseguire del terminale (rmiregistry -J-Djava.rmi.server.hostname=0.0.0.0)
Architettura Il client colloquia con un proxy locale del server, detto stub rappresenta il server sul lato client implementa l interfaccia del server è capace di inoltrare le chiamate di metodi il client ha un riferimento locale all oggetto stub Esiste anche un proxy del client sul lato server, detto skeleton è una rappresentazione del client chiama i servizi del server sa come fare forward dei risultati lo skeleton ha un riferimento all oggetto
Architettura
Creazione Definire una interfaccia remota per la comunicazione tra client e server Definire un oggetto remoto che implementa l interfaccia e un applicazione server (per convenzione si usa lo stesso nome dell interfaccia col suffisso Impl) Definire il client che usa un riferimento all interfaccia remota per accedere all oggetto remoto
Interfaccia remota deve essere pubblica deve estendere java.rmi.remote ogni metodo deve dichiarare java.rmi.remoteexception ogni oggetto remoto passato come parametro o valore di ritorno deve essere dichiarato di tipo interfaccia remota 1 import java.rmi.remote; 2 import java.rmi.remoteexception; 3 4 public interface ExampleServer extends Remote { 5 String foo() throws RemoteException; 6 }
Lato server Inizializzo il registry Istanziare l oggetto remoto obj che implementa l interfaccia remota IR. Creare l oggetto stub tramite UnicastRemoteObject (se obj estende UnicastRemoteObject questo passo non è necessario) Registrare lo stub nel "registry" l oggetto obj potrebbe avere metodi che restituiscono riferimenti agli altri oggetti remoti, evitando così di dover passare attraverso il registry per accedere ad essi. 1 import java.rmi.server.unicastremoteobject 2 //... 3 4 LocateRegistry.createRegistry(1099); 5 IR stub = (IR) UnicastRemoteObject.exportObject(obj, 0); 6 Naming.rebind("//localhost/Server", stub);
Lato client Ottenee un riferimento al registry specificandone indirizzo IP Ottenere un riferimento all oggetto stub usando il registry 1 Registry registry = LocateRegistry.getRegistry(ip); 2 IR stub = (IR) registry.lookup("nome oggetto");
Tipi di oggetti Oggetto remoto, esportato con UnicastRemoteObject.exportObject(obj,0) Si comporta come un normale oggetto Copia serializzata, tutte le modifiche all oggetto hanno effetto solo sulla copia, non sull originale
Remarks Se il server che ha registrato l oggetto termina l esecuzione, l oggetto remoto registrato continua ad esistere finchè il registry è in esecuzione È quindi consigliabile utilizzare rebind anziché bind È anche possibile effettuare l unbind (Naming.unbind);
Esercizio Si implementi tramite RMI la segente applicazione distribuita: ogni client può inviare una stringa di testo al server il server invia ogni stringa ricevuta in broadcast ai client connessi
Esercizio Si implementi il gioco della morra cinese tramite Socket TCP