# Socket e RMI
## Socket
Per i sockets vatti a leggere la documentazione.
## RMI
RMI, Remote Method Invocation si basa sul concetto di Proxy: in pratica RMI ci permette di accedere a un oggetto remoto con interfaccia remota come se fosse un oggetto qualsiasi in locale.
Un paio di termini:
- $stub$ : interfaccia locale del oggetto remoto.
- $skeleton$ : riceve i risultati del client lato server.
- marshals/unmarshals : serializzazione
In RMI viene utilizzato un Registry per collegarci attraverso gli ip/porta ai vari oggetti, anzi interfacce di tali oggetti.
Sostanzialmente l'interfaccia remota deve ereditare la classe Remote, mentre l'oggetto vero e proprio deve ereditare la classe UnicastRemoteObject e implementare l'interfaccia remota.
In genere il Registry gira sulla stessa macchina del server ma in un eseguibile diverso.
````Java
//SERVER SIDE
Server server = new Server();
serverStub stub = server; //interface of Server Remote Object
Registry registry = LocateRegistry.createRegistry(PORT);
registry.bind("server", stub); //Binding server stub
````
Il client fa 'lookup' dell'oggetto remoto utilizzando il Registry (identificato con indirizzo ip e porta) usando LocateRegistry.getRegistry.
````Java
//CLIENT SIDE
Registry registry = LocateRegistry.getRegistry(IP, PORT); //magic
Server server = (serverStub) registry.lookup("server");
// wHat a tImE to be aLiVe!
````