Unidade 5 Atividade de Laboratório - Java RMI Desenvolvendo um Servidor RMI Para aceitar chamadas remotas de métodos via RMI, um servidor deve estender a interface java.rmi.Remote e declarar os métodos que serão acessados remotamente. Na interface RMI abaixo são definidos os métodos add(), sub(), mul() e div() que retornam os resultados das operações artiméticas quando são chamados. Descreve a interface Calculator public interface Calculator extends java.rmi.Remote { public long add(long a, long b) throws java.rmi.RemoteException; public long sub(long a, long b) throws java.rmi.RemoteException; public long mul(long a, long b) throws java.rmi.RemoteException; public long div(long a, long b) throws java.rmi.RemoteException; } A exceção java.rmi.RemoteException indica erros na chamada remota, e deve ser prevista pelos métodos de interfaces RMI. Agora vamos implementar a interface Callculator e para facilitar o nosso trabalho, vamos usar como base a classe UnicastRemoteObject, que já implementa alguns métodos necessários para o servidor. Temos que criar também um construtor para o nosso servidor (neste caso, ele apenas chama o construtor da classe base). Implementando a interface Calculator public class CalculatorImpl extends java.rmi.server.UnicastRemoteObject implements Calculator { public CalculatorImpl() throws java.rmi.RemoteException { super(); } public long add(long a, long b) throws java.rmi.RemoteException { return a + b; } public long sub(long a, long b) throws java.rmi.RemoteException { return a - b; } public long mul(long a, long b) throws java.rmi.RemoteException { return a * b; } public long div(long a, long b) throws java.rmi.RemoteException { return a / b; } } Criando um Servidor Na função main() do servidor iremos criar um objeto que implementa a interface Calculator e registrá-lo como um servidor no registro do RMI, com o nome "CalculatorService", para que ele possa ser localizado pelos clientes. import java.rmi.Naming; public class CalculatorServer { public CalculatorServer() { try { Calculator c = new CalculatorImpl(); Naming.rebind("//localhost/CalculatorService", c); } catch (Exception e) { System.out.println("Trouble: " + e); } } public static void main(String args[]) { new CalculatorServer(); } } Criando um Cliente Cria um cliente que obtenha uma referência para o servidor no registro RMI e chame os métodos add(), sub(), mul() e div(). Abaixo temos um exemplo de aplicação com interface de texto. import java.rmi.Naming; public class CalculatorClient { public static void main(String[] args) { try { Calculator c = (Calculator) Naming.lookup( "rmi://jaca.ime.usp.br:1099/CalculatorService"); System.out.println( c.sub(4, 3) ); System.out.println( c.add(4, 5) ); System.out.println( c.mul(3, 6) ); System.out.println( c.div(9, 3) ); } catch (Exception e) { System.out.println(e); } } } O servidor pode ser acessado também usando uma aplicação gráfica ou através de um applet. Compilando a Aplicação RMI Edite e compile os arquivos acima usando o compilador Java ou um IDE da sua escolha. Crie também stubs e skeletons (ou seja, o código para comunicação via RMI) para a nossa aplicação usando compilador RMI (rmic). > javac *.java > rmic CalculatorServer Executando a Aplicação RMI Primeiramente, inicie o registro RMI com o comando: > start rmiregistry Em seguida, inicie o servidor: > start java CalculatorServer Finalmente, inicie o cliente com o comando: > java CalculatorClient localhost Tente também, com a ajuda de um colega, fazer a comunicação entre máquinas diferentes. Para isto, substitua 'localhost' pelo nome da máquina do outro grupo ao chamar o cliente. Um exemplo numa máquina remota "rmi://jaca.ime.usp.br:1099/CalculatorService")