Documentos de Académico
Documentos de Profesional
Documentos de Cultura
50,
5HPRWH0HWKRG,QYRFDWLRQ
5HPRWH0HWKRG,QYRFDWLRQ
0RGHORGH REMHWRV
0RGHORGHREMHWRVHQVLVWHPDVGLVWULEXLGRV
(OVXHxRGHWRGRVLVWHPDGLVWULEXLGR
objetoDistante.metodo()
REMHWR'LVWDQWH
6HUYLFLR'H1RPEUHVEXVFDPL2EMHWR
(OVXHxRGHWRGRVLVWHPDGLVWULEXLGR
3RGHUSDVDUXQ2'FRPRSDUiPHWURGH
OODPDGDDXQPpWRGRORFDOyUHPRWR
UHVXOWDGR
REMHWR/RFDOPHWRGRREMHWR'LVWDQWH
UHVXOWDGR
REMHWR'LVWDQWHPHWRGRRWUR2EMHW'LVWDQWH
3RGHUUHFLELUFRPRUHVXOWDGRGHXQDLQYRFDFLyQXQ
REMHWRTXHKDVLGRFUHDGRHQXQDPiTXLQDGLVWDQWH
2EMHWR'LVWDQWH 2EMHWR'LVWDQWHPHWRGR
&RPXQLFDFLyQHQWUHREMHWRVUHPRWRV
-DYD9LUWXDO0DFKLQH -DYD9LUWXDO0DFKLQH
&OLHQW 5HPRWH
2EMHFW 7&3 2EMHFW
/DVFDSDVGH50,
-DYD9LUWXDO0DFKLQH -DYD9LUWXDO0DFKLQH
&OLHQW 5HPRWH
2EMHFW 2EMHFW
6WXE 6NHOHWRQ
5HPRWH5HIHUHQFH/D\HU 5HPRWH5HIHUHQFH/D\HU
7&3
7UDQVSRUW/D\HU 7UDQVSRUW/D\HU
&RS\ULJKW$OH[&KDIIHH
$UTXLWHFWXUDGH-DYD50,
Capa de Aplicación
2EMHWR&OLHQWH 2EMHWR6HUYLGRU
Capa de Representantes
6WXE 6NHOHWRQ
Proxy
Capa de Protocolo de
7UDQVSRUWH 7UDQVSRUWH
Comunicación (TCP/IP)
3URWRFRORVGH%DMR1LYHO
&RPXQLFDFLyQHQWUHHO&OLHQWH\HO6HUYLGRU
2EMHWR&OLHQWH 2EMHWR6HUYLGRU
6WXE 6NHOHWRQ
Solicitud Cliente
5HIHUHQFLD 5HIHUHQFLD
Respuesta Servidor
5HPRWD 5HPRWD
7UDQVSRUWH 7UDQVSRUWH
3URWRFRORVGH%DMR1LYHO
$UTXLWHFWXUDGH-DYD50,
Capa de Aplicación . Objetos que implementan la aplicación. En general en este nivel
se distinguen dos tipos de agentes: los clientes, que son objetos que invocan métodos o
hacen peticiones a otros objetos remotos y los servidores, que son objetos que reciben
peticiones de otros objetos remotos.
+HUHQFLDGHWLSR9V+HUHQFLDGHFODVH
&ODVH 7LSR
-DYDH[WHQGV -DYDLPSOHPHQWV
6XE&ODVH 6XE7LSR
7HFQRORJtDGH2EMHWRV
3ROLPRUILVPR
&OLHQWH ,QWHUIDFH
-DYDLPSOHPHQWV
2EMHWRV
,QWHUIDFHVWXEVNHOHWRQ
5HPRWH,QWHUIDFH
LPSOHPHQWV LPSOHPHQWV
5HPRWH2EMHFW
&OLHQW 6WXE 6NHOHWRQ
6HUYHU
&RS\ULJKW$OH[&KDIIHH
3DWUyQ*HQHUDOSDUDOD,QYRFDFLyQ5HPRWD
&OLHQWH 6HUYLGRU
6WXE 6NHOHWRQ
,QIUDVWUXFWXUD
/ODPDGD 6HUYLFLR
± (PSDFDUDUJXPHQWRV ± 5HFLELUGDWRV
± FRQYHUWLUDIRUPDWRGH ± 'HVHPSDFDU
UHG ± ,QYRFDUPpWRGR
± /RFDOL]DUHOVHUYLGRU ± (PSDFDUODUHVSXHVWD
± WUDQVPLWLUGDWRV ± WUDQVPLWLUGDWRV
50,5HJLVWU\
50,UHJLVWU\HVXQVHUYLFLRGHQRPEUHVXELFDGRHQHOVHUYLGRU
TXHSHUPLWHTXHORVFOLHQWHVUHPRWRVREWHQHUXQDUHIHUHQFLDGH
XQREMHWRUHPRWR
3DUDHMHFXWDUHOUHJLVWU\HMHFXWHHOFRPDQGR
± UPLUHJLVWU\
(OUHJLVWURXWLOL]DHOSXHUWRSRUGHIDXOW
(O6HUYLFLRGH1RPEUHVHQ50,
1DPLQJ HVXQDFODVHGHOSDTXHWHGH50,TXH
SURSRUFLRQDHOVHUYLFLRGHUHJLVWURGHREMHWRVUHPRWRV
3HUPLWHUHODFLRQDUXQQRPEUHWLSR85/FRPRSRUHMHPSOR
³UPLKRVWREMHFWQDPH´
FRQXQREMHWRUHPRWRKRVWHVHOQRPEUHR,3GHOD
PiTXLQDGRQGHVHXELFDHOREMHWR\REMHFWQDPH HVXQVWULQJ
6LVHRPLWHHOKRVWVHDVXPHTXHHVXQREMHWRORFDO
6HGHEHDJUHJDUXQQ~PHURGHSXHUWRVLHOVHUYLFLRGH
QRPEUHVQRIXHLQVWDODGRHQHOSXHUWR
³UPLKRVWREMHFWQDPH´
/DVPDQHUDVGHXVDU1DPLQJ
(QHOVHUYLGRU
(OVHUYLGRUUHJLVWUDHOREMHWRUHPRWR
HelloImp obj = new HelloImpl();
Naming.rebind(“//myhost/HelloServer”, obj);
(QHOFOLHQWH
(OFOLHQWHREWLHQHXQDUHIHUHQFLDGHOREMHWRUHPRWRPHGLDQWHVXQRPEUH
+HOORREM +HOOR1DPLQJORRNXS´P\KRVW+HOOR6HUYHU´
1DPLQJORRNXSUHJUHVDXQWLSR2EMHFWSRUORTXHHOREMHWRREWHQLGRGHEH
FRQYHUWLUVHDODFODVH
7DEODGHQRPEUHV
2EMHWR
1DPLQJ 5HPRWR
³EDQFR´ $ 2EMHWR
5HPRWR
³FXHQWD´
2EMHWR &
³FXHQWD´ 5HPRWR
%
+RVWFVPW\LWHVPP[
8VRGHODWDEOD
ORRNXS³UPLFVPW\LWHVPP[FXHQWD´
1DPLQJ
2EMHWR ³EDQFR´ 2EMHWR
&OLHQWH 5HPRWR
³FXHQWD´ 6HUYLGRU
5HIHUHQFLD ³FXHQWD´
UHPRWD
WHFFRP +RVWFVPW\LWHVPP[
0HWRGRVHVWiWLFRVGHODFODVH1DPLQJ
YRLG ELQG6WULQJ5HPRWH
%LQGVWKHQDPHWRWKHVSHFLILHGUHPRWHREMHFW
()*%+,-. OLVW6WULQJ
!"#$%&'()*%+,
!"#$%&'()*%+,-.
5HWXUQVDQDUUD\RIVWULQJVRIWKH85/VLQWKHUHJLVWU\
SXEOLF5HPRWH ORRNXS6WULQJ
5HWXUQVWKHUHPRWHREMHFWIRUWKH85/
SXEOLFYRLG UHELQG6WULQJ5HPRWH
5HELQGWKHQDPHWRDQHZREMHFWUHSODFHVDQ\H[LVWLQJ
ELQGLQJ
SXEOLFYRLG XQELQG6WULQJ
8QELQGWKHQDPH
$UTXLWHFWXUD50,
&OLHQW9LUWXDO0DFKLQH 6HUYHU9LUWXDO0DFKLQH
&OLHQW 5HPRWH
2EMHFW
6NHOHWRQ
6WXE 6HUYHU
³)UHG´
5HJLVWU\9LUWXDO0DFKLQH
)OXMR50,
1. El servidor crea el objeto remoto
&OLHQW9LUWXDO0DFKLQH 6HUYHU9LUWXDO0DFKLQH
2. El servidor registra el objeto remoto
&OLHQW 5HPRWH
2EMHFW
6NHOHWRQ
6WXE 6HUYHU
³)UHG´
5HJLVWU\9LUWXDO0DFKLQH
)OXMR50,
&OLHQW9LUWXDO0DFKLQH 6HUYHU9LUWXDO0DFKLQH
&OLHQW 5HPRWH
3. El cliente solicita el objeto al Registry
2EMHFW
4. El Registry regresa la referencia
remota
6NHOHWRQ
6WXE 6HUYHU
³)UHG´
5HJLVWU\9LUWXDO0DFKLQH
)OXMR50,
&OLHQW9LUWXDO0DFKLQH 6HUYHU9LUWXDO0DFKLQH
&OLHQW 5HPRWH
2EMHFW
6NHOHWRQ
6WXE 6HUYHU
5HJLVWU\9LUWXDO0DFKLQH
,QWHUIDFHV2EMHWRV\0pWRGRV5HPRWRV
&UHDU$SOLFDFLRQHV'LVWULEXLGDVXWLOL]DQGR50,
Cuando se utiliza RMI para desarrollar una aplicación distribuida,
debemos seguir estos pasos generales:
• Arrancar la Aplicación.
'LVHxDUHLPSOHPHQWDUORVFRPSRQHQWHVGHQXHVWUD
DSOLFDFLyQGLVWULEXLGD
• Definir los Interfaces Remotos.
Remotos Una interfaz remota especifica
los métodos que pueden ser llamados remotamente por un
cliente.
// Hello.java:
import java.rmi.*;
public interface Hello extends Remote {
public String sayhello() throws RemoteException;
}
,PSOHPHQWDUOD,QWHUID]5HPRWD
$FRQWLQXDFLyQH[SORUDUHPRVODFODVHTXHLPSOHPHQWD
ODLQWHUID]+HOORTXHLPSOHPHQWDXQREMHWRUHPRWR
(VWDFODVHWDPELpQSURSRUFLRQDHOUHVWRGHOFyGLJRTXH
FRQILJXUDHOSURJUDPDVHUYLGRUXQPpWRGRPDLQ TXH
FUHDXQHMHPSODUGHOREMHWRUHPRWR
ORUHJLVWUDFRQODIDFLOLGDGGHQRPEUDGR\
FRQILJXUDXQFRQWURODGRUGHVHJXULGDG
&RPSRQHQWHVGHODLPSOHPHQWDFLyQGHOVHUYLGRU
&RPSRQHQWHVGHODLPSOHPHQWDFLyQGHOVHUYLGRU
(OPpWRGRPDLQ GHO6HUYLGRU
(VWHPpWRGRHVXWLOL]DGRSDUDDUUDQFDUHOVHUYLGRU\
SRUORWDQWRQHFHVLWDKDFHUODLQLFLDOL]DFLyQQHFHVDULD
SDUDSUHSDUDUVHSDUDDFHSWDUOODPDGDVGHORVFOLHQWHV
&yPRHOPpWRGRPDLQ VHGHFODUDVWDWLFQRHVWi
DVRFLDGRFRQQLQJ~QREMHWRVLQRFRQODFODVH
+HOORLPSO
&RPSRQHQWHVGHODLPSOHPHQWDFLyQGHOVHUYLGRU
&UHDUH,QVWDODUXQ&RQWURODGRUGH6HJXULGDG
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
&RPSRQHQWHVGHODLPSOHPHQWDFLyQGHOVHUYLGRU
Naming.rebind(name, h);
3URJUDPD 6HUYLGRU
public class Helloimpl extends UnicastRemoteObject implements Hello
{
public Helloimpl() throws RemoteException {
super();
}
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());}
try {
String name = "//localhost/hello";
Helloimpl h= new helloimpl();
Naming.rebind(name, h);
System.out.println ("Hello Server ready.");
} catch (Exception e) {
System.err.println("Exception in helloimpl: " + e.getMessage());
e.printStackTrace();}
}
}
&UHDU XQ SURJUDPD FOLHQWH
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
String name = "//localhost /hello";
Hello h= (Hello) Naming.lookup (name);
String message = h.sayhello();
System.out.println ("helloclient : " + message);
} catch (Exception e)
{
System.out.println ("Exception in main: " + e);
}
}
}
&RPSLODFLyQ \ HMHFXFLyQ
Se utiliza el compilador javac para compilar los archivos fuentes
de Java, los cuales contienen las implementaciones de los
interfaces remotos, las clases del servidor, y del cliente.
javac Helloclient.java
javac Hello.java
javac Helloimpl.java
(MHFXFLyQGHOSURJUDPD
Una vez compilados y creados los stubs, es necesario ejecutar el registro
RMI, que como ya mencionamos permite a los clientes remotos obtener
una referencia a un objeto remoto por su nombre.
rmiregistry
Y por ultimo, ejecutar en otras ventanas el servidor y el cliente una de las
opciones siguientes:
java Helloimpl
E
java Helloclient 9HUVLyQFRUWDGHORVFRPDQGRVDXWLOL]DU
FXDQGRHOFyGLJRQRXWLOL]D
³6HFXULW\0DQDJHU´
-DYD3ROLF\)LOH
(Q-DYDODVDSOLFDFLRQHVGHEHQDFFHVDUXQOLVWDGH
SULYLOLHJLRV3DUDHVWRFRQVXOWDQODSROtWLFDGHVHJXULGDG
VHFXULW\SROLF\PHGLDQWHXQDUFKLYRSROLF\ILOH(QHO
VLJXLHQWHHMHPSORVHSHUPLWHQWRGRVORVSULYLOHJLRV\DTXH
HOFRQWHQLGRGHODUFKLYRSROLF\DOOHV
grant {
permission java.security.AllPermission;
};
$1(;2
¢&yPRHVFULELUDSOLFDFLRQHVFRQ-DYD50,"
Definición de la
1 interfaz remota
Implementación de la
2 interfaz remota
(.java)
3 javac
(.class)
4 rmic Servidor
(.class)
Esqueleto
8 Cliente
usa Stub
(.class)
(.class)
(.java)
5 Arrancar RMIRegistry
9 javac
Ejecutar
10 Cliente 7 Registrar los objetos
CLIENTE SERVIDOR
$1(;2
6WHSVIRU'HYHORSLQJDQ50,6\VWHP
'HILQHWKHUHPRWHLQWHUIDFH
'HYHORSWKHUHPRWHREMHFWE\LPSOHPHQWLQJWKHUHPRWH
LQWHUIDFH
'HYHORSWKHFOLHQWSURJUDP
&RPSLOHWKH-DYDVRXUFHILOHV
*HQHUDWHWKHFOLHQWVWXEVDQGVHUYHUVNHOHWRQV
6WDUWWKH50,UHJLVWU\
6WDUWWKHUHPRWHVHUYHUREMHFWV
5XQWKHFOLHQW
6WHS'HILQLQJWKH5HPRWH,QWHUIDFH
7RFUHDWHDQ50,DSSOLFDWLRQWKHILUVWVWHSLVWKHGHILQLQJ
RIDUHPRWHLQWHUIDFHEHWZHHQWKHFOLHQWDQGVHUYHUREMHFWV
/* SampleServer.java */
import java.rmi.*;
6WHS'HYHORSWKHUHPRWHREMHFWDQGLWVLQWHUIDFH
7KHVHUYHULVDVLPSOHXQLFDVWUHPRWHVHUYHU
&UHDWHVHUYHUE\H[WHQGLQJjava.rmi.server.UnicastRemoteObject
7KHVHUYHUXVHVWKH50,6HFXULW\0DQDJHUWRSURWHFWLWVUHVRXUFHV
ZKLOHHQJDJLQJLQUHPRWHFRPPXQLFDWLRQ
/* SampleServerImpl.java */
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
,PSOHPHQWWKHUHPRWHPHWKRGV
/* SampleServerImpl.java */
public int sum(int a,int b) throws RemoteException
{
return a + b;
}
}
7KHVHUYHUPXVWELQGLWVQDPHWRWKHUHJLVWU\WKHFOLHQW
ZLOOORRNXSWKHVHUYHUQDPH
8VHjava.rmi.Naming FODVVWRELQGWKHVHUYHUQDPH
WRUHJLVWU\,QWKLVH[DPSOHWKHQDPHFDOO³6$03/(
6(59(5´
,QWKHPDLQPHWKRGRI\RXUVHUYHUREMHFWWKH50,
VHFXULW\PDQDJHULVFUHDWHGDQGLQVWDOOHG
6WHS'HYHORSWKHUHPRWHREMHFWDQGLWVLQWHUIDFH
/* SampleServerImpl.java */
public static void main(String args[])
{
try
{
System.setSecurityManager(new RMISecurityManager());
//set the security manager
System.out.println("Server waiting.....");
}
catch (java.net.MalformedURLException me) {
System.out.println("Malformed URL: " + me.toString()); }
catch (RemoteException re) {
System.out.println("Remote exception: " + re.toString()); }
}
6WHS'HYHORSWKHFOLHQWSURJUDP
,QRUGHUIRUWKHFOLHQWREMHFWWRLQYRNHPHWKRGVRQWKH
VHUYHULWPXVWILUVWORRNXSWKHQDPHRIVHUYHULQWKH
UHJLVWU\<RXXVHWKHjava.rmi.Naming FODVVWR
ORRNXSWKHVHUYHUQDPH
7KHVHUYHUQDPHLVVSHFLILHGDV85/LQWKHIURP
UPLKRVWSRUWQDPH
'HIDXOW50,SRUWLV
7KHQDPHVSHFLILHGLQWKH85/PXVWH[DFWO\PDWFKWKH
QDPHWKDWWKHVHUYHUKDVERXQGWRWKHUHJLVWU\,QWKLV
H[DPSOHWKHQDPHLV³6$03/(6(59(5´
7KHUHPRWHPHWKRGLQYRFDWLRQLVSURJUDPPHGXVLQJWKH
UHPRWHLQWHUIDFHQDPHremoteObjectDVSUHIL[DQG
WKHUHPRWHPHWKRGQDPHsumDVVXIIL[
6WHS'HYHORSWKHFOLHQWSURJUDP
import java.rmi.*;
public class SampleClient
{
public static void main(String[] args)
{
// set the security manager for the client
System.setSecurityManager(new RMISecurityManager());
//get the remote object from the registry
try
{
System.out.println("Security Manager loaded");
String url = "//localhost/SAMPLE-SERVER";
SampleServer remoteObject = (SampleServer)Naming.lookup(url);
System.out.println("Got remote object");
System.out.println(" 1 + 2 = " + remoteObject.sum(1,2) );
}
catch (RemoteException exc) {
System.out.println("Error in lookup: " + exc.toString()); }
catch (java.net.MalformedURLException exc) {
System.out.println("Malformed URL: " + exc.toString()); }
catch (java.rmi.NotBoundException exc) {
System.out.println("NotBound: " + exc.toString());
}
}
}
6WHS &RPSLOHWKH-DYDVRXUFHILOHV *HQHUDWH
WKHFOLHQWVWXEVDQGVHUYHUVNHOHWRQV
$VVXPHWKHSURJUDPFRPSLOHDQGH[HFXWLQJDW
HOSLVRQaUPL
2QFHWKHLQWHUIDFHLVFRPSOHWHG\RXQHHGWR
JHQHUDWHVWXEVDQGVNHOHWRQFRGH7KH50,V\VWHP
SURYLGHVDQ50,FRPSLOHUrmicWKDWWDNHV\RXU
JHQHUDWHGLQWHUIDFHFODVVDQGSURFHGXUHVVWXEFRGH
RQLWVVHOI
> javac SampleServer.java
> javac SampleServerImpl.java
> rmic SampleServerImpl
6WHS6WDUWWKH50,UHJLVWU\
7KH50,DSSOLFDWLRQVQHHGLQVWDOOWR5HJLVWU\$QGWKH
5HJLVWU\PXVWVWDUWPDQXDOE\FDOOrmiregisty
7KHrmiregistry XVXVHVSRUWE\GHIDXOW<RXFDQ
DOVRELQGUPLUHJLVWU\WRDGLIIHUHQWSRUWE\LQGLFDWLQJWKH
QHZSRUWQXPEHUDVrmiregistry <new port>
> rmiregistry
5HPDUN2Q:LQGRZV\RXKDYHWRW\SHLQIURPWKH
FRPPDQGOLQH
> start rmiregistry
6WHSV 6WDUWWKHUHPRWHVHUYHUREMHFWV 5XQWKH
FOLHQW
2QFHWKH5HJLVWU\LVVWDUWHGWKHVHUYHUFDQEHVWDUWHGDQG
ZLOOEHDEOHWRVWRUHLWVHOILQWKH5HJLVWU\
%HFDXVHRIWKHJUDLQHGVHFXULW\PRGHOLQ-DYD\RX
PXVWVHWXSDVHFXULW\SROLF\IRU50,E\VHW
java.security.policy WRWKHILOHpolicy.all
-DYD3ROLF\)LOH
grant {
permission java.security.AllPermission;
};
-DYD3ROLF\)LOH
1RZZHJLYHQDQH[DPSOHIRUDVVLJQLQJUHVRXUFHSHUPLVVLRQV
JUDQW^
SHUPLVVLRQMDYDLRILOH3HUPLVVLRQ³WPS
´³UHDG´³ZULWH´
SHUPLVVLRQMDYDQHW6RFNHW3HUPLVVLRQ
³VRPHKRVWVRPHGRPDLQFRP´´FRQQHFW´
SHUPLVVLRQMDYDQHW6RFNHW3HUPLVVLRQ³
´´FRQQHFWUHTXHVW´
SHUPLVVLRQMDYDQHW6RFNHW3HUPLVVLRQ³
´´FRQQHFW´
`