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 é definido um método hello(), que retorna uma saudação quando é chamado.
/** HelloWorld.java **/
import java.rmi.*;
public interface HelloWorld extends Remote {
public String hello() throws 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. 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).
/** HelloServer.java **/
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
public class HelloServer implements HelloWorld {
public HelloServer() {}
// main()
// hello()
}
Na função main() do servidor iremos criar um objeto que implementa a interface HelloWorld e registrá-lo como um servidor no registro do RMI, com o nome "HelloWorld", para que ele possa ser localizado pelos clientes.
public static void main(String[] args) {
try {
// Instancia o objeto servidor e a sua stub
HelloServer server = new HelloServer();
HelloWorld stub = (HelloWorld) UnicastRemoteObject.exportObject(server, 0);
// Registra a stub no RMI Registry para que ela seja obtida pelos clientes
Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);
System.out.println("Servidor pronto");
} catch (Exception ex) {
ex.printStackTrace();
}
}
Temos que implementar agora os métodos definidos na interface do servidor. Nesta aplicação, há apenas o método hello() para ser implementado.
public String hello() throws RemoteException {
System.out.println("Executando hello()");
return "Hello!!!";
}
Crie um cliente que obtenha uma referência para o servidor no registro RMI e chame o método hello(). Abaixo temos um exemplo de aplicação com interface de texto.
/** HelloClient.java **/
import java.rmi.registry.*;
public class HelloClient {
public static void main(String[] args) {
String host = (args.length < 1) ? null : args[0];
try {
// Obtém uma referência para o registro do RMI
Registry registry = LocateRegistry.getRegistry(host);
// Obtém a stub do servidor
HelloWorld stub= (HelloWorld) registry.lookup("Hello");
// Chama o método do servidor e imprime a mensagem
String msg = stub.hello();
System.out.println("Mensagem do Servidor: " + msg);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
O servidor pode ser acessado também usando uma aplicação gráfica ou através de um applet.
Edite e compile os arquivos acima usando o compilador Java:
> javac *.java
No Windows, você deve abrir um Prompt de comando, ir até o diretório no qual estão as classes compiladas e iniciar o registro RMI com o comando:
> start rmiregistry
Em seguida, execute o servidor:
> start java HelloServer
Finalmente, inicie o cliente com o comando:
> java HelloClient localhost
Tente também, com a ajuda de um colega, fazer a comunicação entre máquinas diferentes. Para isto, substitua 'localhost' pelo endereço IP da máquina do colega ao chamar o cliente.
No Linux, abra um terminal, vá até o diretório no qual estão as classes compiladas e execute o seguinte comando:
> rmiregistry &
Em seguida, execute o servidor:
> java HelloServer
Finalmente, abra outro terminal, vá até o diretório no qual estão as classes compiladas e inicie o cliente com o comando:
> java HelloClient localhost