INF01018 – Aula Prática 2 – RMI – Remote Method Invocation Lucas Mello Schnorr, Alexandre Silva Carı́ssimi {lmschnorr,asc}@inf.ufrgs.br http://www.inf.ufrgs.br/∼lmschnorr/ad/ INF01018 – Sistemas Operacionais Distribuı́dos e de Redes Sala 102 – Prédio 67 – 14 Setembro 2006 1 / 18 Roteiro 1 Relembrando a Parte Teórica 2 Levando a teoria para Java RMI 3 Projeto do Programa 4 Roteiro da Implementação 5 Detalhes Importantes 6 Execução da Aplicação 7 Referências 2 / 18 Relembrando a Parte Teórica Estrutura básica (Couloris) Proxy, Dispatcher, Stubs, Módulos de referência e de comunicação Marshalling – Unmarshalling 3 / 18 Java RMI a partir da teoria 4 / 18 Projeto do Programa 5 / 18 Roteiro da Implementação – Server 1 2 3 4 CalculatorInterface CalculatorImpl Criação dos Stubs e Proxy com auxı́lio de rmic CalculatorServer 6 / 18 Passo 1 – CalculatorInterface.java 0 1 2 3 4 5 6 7 8 9 10 11 12 public i n t e r f a c e C a l c u l a t o r I n t e r f a c e extends j a v a . r m i . Remote { public long add ( long a , long b ) throws j a v a . r m i . RemoteException ; public long sub ( long a , long b ) throws j a v a . r m i . RemoteException ; public long mul ( long a , long b ) throws j a v a . r m i . RemoteException ; public long div ( long a , long b ) throws j a v a . r m i . RemoteException ; } 7 / 18 Passo 2 – CalculatorImpl.java 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class C a l c u l a t o r I m p l extends j a v a . r m i . s e r v e r . UnicastRemoteObject implements C a l c u l a t o r I n t e r f a c e { public C a l c u l a t o r I m p l ( ) throws j a v a . r m i . RemoteException { super ( ) ; } public long add ( long a , long b ) { System . o u t . p r i n t l n ( a+ ” ∗ ” +b+ ” = ” +( a+b ) ) ; return a + b ; } public long sub ( long a , long b ) { System . o u t . p r i n t l n ( a+ ”−” +b+ ” = ” +( a−b ) ) ; return a − b ; } / ∗ . . . mul e d i v . . . ∗ / 8 / 18 Passo 3 – Stub e Proxy usando rmic javac CalculatorInterface.java javac CalculatorImpl.java rmic CalculatorImpl Será criado um arquivo CalculatorImpl Stub.class Utilização automática pelo RMI do Java Marshalling e Unmarshalling dos dados Utilizada na execução do servidor e do cliente 9 / 18 Passo 4 – CalculatorServer.java 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class C a l c u l a t o r S e r v e r { public C a l c u l a t o r S e r v e r ( ) throws E x c e p ti o n { / ∗ c r i a c a o do g e r e n c i a d o r de seguranca ∗ / System . s e tS e c u r i ty M a n a g e r (new RMISecurityManager ( ) ) ; / ∗ c r i a c a o do o b j e t o C a l c u l a t o r I m p l ∗ / C a l c u l a t o r I n t e r f a c e c a l c u l a t o r = new C a l c u l a t o r I m p l ( ) ; / ∗ associacao desse o b j e t o a um nome ∗ / j a v a . r m i . Naming . r e b i n d ( ” r m i : / / carpa . i n f . u f r g s . b r : 1 0 9 9 / C a l c u l a t o r S e r v i c e ” , calculator ) ; } public s t a t i c void main ( S t r i n g args [ ] ) throws E x c e p ti o n { new C a l c u l a t o r S e r v e r ( ) ; } } 10 / 18 Roteiro da Implementação – Client 1 CalculatorClient 11 / 18 Passo 1 – CalculatorClient.java 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class C a l c u l a t o r C l i e n t { public s t a t i c void main ( S t r i n g [ ] args ) throws E x c e p ti o n { System . s e tS e c u r i ty M a n a g e r ( new RMISecurityManager ( ) ) ; CalculatorInterface c ; / ∗ e n c o n t r a r o o b j e t o remoto a p a r t i r do nome ∗ / c = ( CalculatorInterface ) Naming . lookup ( ” r m i : / / carpa . i n f . u f r g s . b r / C a l c u l a t o r S e r v i c e ” ) ; / ∗ chamada de metodos do o b j e t o remoto ∗ / System . o u t . p r i n t l n ( c . sub ( 4 , 3 ) ) ; System . o u t . p r i n t l n ( c . add ( 4 , 5 ) ) ; System . o u t . p r i n t l n ( c . mul ( 3 , 6 ) ) ; System . o u t . p r i n t l n ( c . div ( 9 , 3 ) ) ; 12 / 18 Detalhes Importantes Execução do cliente sem o Proxy Execução do cliente sem o Proxy schnorr@hurricane:∼/client$ java CalculatorClient RemoteException java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException: CalculatorImpl Stub schnorr@hurricane:∼/client$ 13 / 18 Detalhes Importantes Execução do cliente sem o Proxy Como o cliente encontra o Proxy (CalculatorImpl Stub.class) Copiar o arquivo da classe para o diretório onde o cliente será executado Especificar a localização da classe para a máquina virtual no momento da execução do cliente Propriedades do Java (Java Properties) java.rmi.server.codebase=LOCALIZACAO DA CLASSE A localização pode ser: endereço (http://www.inf.ufrgs.br/∼lmschnorr/ad/classes/) diretório (file:///home/usuarios/nomedousuario/classes/) entre outros Para usar: java -Djava.rmi.server.codebase=http://www/∼lmschnorr/ad/classes/ CalculatorClient 14 / 18 Detalhes Importantes Execução do cliente sem segurança Execução do cliente sem segurança schnorr@hurricane:∼/client$ java CalculatorClient Exception in thread ”main”java.security.AccessControlException: access denied (java.net.SocketPermission carpa.inf.ufrgs.br resolve) schnorr@hurricane:∼/client$ 15 / 18 Detalhes Importantes Execução do cliente sem segurança 8 9 public s t a t i c void main ( S t r i n g [ ] args ) throws E x c e p ti o n { System . s e tS e c u r i ty M a n a g e r ( new RMISecurityManager ( ) ) ; A classe RMISecurityManager precisa de um arquivo com polı́ticas de segurança para a máquina virtual Arquivo texto java.policy 0 1 2 3 grant { p e r m i s s i o n j a v a . n e t . SocketPermission ” ∗:1024−65535 ” , ” connect , acce p e r m i s s i o n j a v a . n e t . SocketPermission ” ∗:80 ” , ” connect ” ; }; Propriedades do Java (Java Properties) java -Djava.security.policy=java.policy CalculatorClient 16 / 18 Execução da Aplicação Execução utilizando os terminals 17 / 18 Referências jGuru: Remote Method Invocation (RMI) http://java.sun.com/developer/onlineTraining/rmi/RMI.html Dynamic code downloading using RMI http://java.sun.com/j2se/1.4.2/docs/guide/rmi/codebase.html Java Remote Method Invocation: - Contents http://java.sun.com/j2se/1.4.2/docs/guide/rmi/spec/rmiTOC.html Package java.rmi – Descrição das classes e métodos http://java.sun.com/j2se/1.4.2/docs/api/java/rmi/package-summary.html The Java Tutorials – Trail: RMI: Table of Contents http://java.sun.com/docs/books/tutorial/rmi/TOC.html 18 / 18