1 / 18 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
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 6 / 18 1 CalculatorInterface 2 CalculatorImpl 3 Criação dos Stubs e Proxy com auxílio de rmic 4 CalculatorServer
Passo 1 CalculatorInterface.java 7 / 18 0 public in terface C a l c u l a t o r I n t e r f a c e extends java. rmi. Remote { 1 public long add ( long a, long b ) 2 throws java. rmi. RemoteException ; 3 4 public long sub ( long a, long b ) 5 throws java. rmi. RemoteException ; 6 7 public long mul ( long a, long b ) 8 throws java. rmi. RemoteException ; 9 10 public long div ( long a, long b ) 11 throws java. rmi. RemoteException ; 12 }
Passo 2 CalculatorImpl.java 8 / 18 0 public class C a l c u l a t o r I m p l 1 extends java. rmi. server. UnicastRemoteObject 2 implements C a l c u l a t o r I n t e r f a c e { 3 4 public C a l c u l a t o r I m p l ( ) 5 throws java. rmi. RemoteException { 6 super ( ) ; 7 } 8 9 public long add ( long a, long b ) { 10 System. out. p r i n t l n ( a+ +b+ = +(a+b ) ) ; 11 return a + b ; 12 } 13 14 public long sub ( long a, long b ) { 15 System. out. p r i n t l n ( a+ +b+ = +(a b ) ) ; 16 return a b ; 17 } 18 /... mul e d i v... /
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 10 / 18 3 public class CalculatorServer { 4 public CalculatorServe r ( ) throws Exception { 5 / criacao do gerenciador de seguranca / 6 System. setsecuritymanager (new RMISecurityManager ( ) ) ; 7 8 / criacao do objeto C a l c u l a t o r I m p l / 9 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 ( ) ; 10 11 / associacao desse objeto a um nome / 12 java. rmi. Naming. rebind 13 ( rmi : / / carpa. i n f. u f r g s. br :1099/ C a l c u l a t o r S e r v i c e, 14 c a l c u l a t o r ) ; 15 } 16 17 public s t a t i c void main ( S t r i n g args [ ] ) throws Exception{ 18 new CalculatorServ er ( ) ; 19 } 20 }
Roteiro da Implementação Client 11 / 18 1 CalculatorClient
Passo 1 CalculatorClient.java 12 / 18 6 7 public class C a l c u l a t o r C l i e n t { 8 public s t a t i c void main ( S t r i n g [ ] args ) throws Exception { 9 System. setsecuritymanager (new RMISecurityManager ( ) ) ; 10 C a l c u l a t o r I n t e r f a c e c ; 11 12 / encontrar o objeto remoto a p a r t i r do nome / 13 c = ( C a l c u l a t o r I n t e r f a c e ) 14 Naming. lookup 15 ( rmi : / / carpa. i n f. u f r g s. br / C a l c u l a t o r S e r v i c e ) ; 16 17 / chamada de metodos do objeto remoto / 18 System. out. p r i n t l n ( c. sub ( 4, 3 ) ) ; 19 System. out. p r i n t l n ( c. add ( 4, 5 ) ) ; 20 System. out. p r i n t l n ( c. mul ( 3, 6 ) ) ; 21 System. out. p r i n t l n ( c. div ( 9, 3 ) ) ;
Detalhes Importantes Execução do cliente sem o Proxy 13 / 18 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$
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 15 / 18 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$
Detalhes Importantes Execução do cliente sem segurança 16 / 18 8 public s t a t i c void main ( S t r i n g [ ] args ) throws Exception { 9 System. setsecuritymanager (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 grant { 1 permission java. net. SocketPermission :1024 65535, connect, acce 2 permission java. net. SocketPermission :80, connect ; 3 } ; Propriedades do Java (Java Properties) java -Djava.security.policy=java.policy CalculatorClient
Execução da Aplicação 17 / 18 Execução utilizando os terminals
Referências 18 / 18 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