You are on page 1of 7

Definir a interface remota

Um objeto remoto uma instncia de uma classe que implementa uma interface
remota. A interface remota estende a interface java.rmi.Remote e declara um conjunto
de mtodos remotos. Cada mtodo remoto deve declarar java.rmi.RemoteException
(ou uma superclasse de RemoteException) em sua lances clusula, alm de todas as
excees especficas do aplicativo.
Aqui a definio de interface para a interface remota utilizada neste
exemplo, example.hello.Hello. Declara apenas um mtodo,sayHello, que
retorna uma seqncia de caracteres para o chamador:
package example.hello;
import java.rmi.Remote ;
import java.rmi.RemoteException ;
interface public Hello extend remoto {
void sayHello () throws RemoteException;
}
Invocaes de mtodo remoto pode falhar em muitas maneiras adicionais
em comparao com invocaes de mtodos locais (tais como problemas
de comunicao relacionados rede e problemas de servidor), e mtodos
remotos ir relatar tais falhas, lanando uma java.rmi.RemoteException.

Implementar o servidor
A classe "server", neste contexto, a classe que tem um principal mtodo que cria
uma instncia da implementao do objeto remoto, exporta o objeto remoto, e em
seguida, liga essa instncia para um nome em um registro Java RMI (rmiregistry). A
classe que contm esse principal mtodo poderia ser a prpria classe de
implementao, ou de outra classe inteiramente.
Neste exemplo, o principal mtodo para o servidor definida na classe
servidor que tambm implementa a interface remota Ol. O servidor
principal mtodo faz o seguinte:
Criar e exportar um objeto remoto
Registre o objeto remoto com um registro de Java RMI

Aqui est o cdigo-fonte da classe de servidor. Descries para escrever


esta classe de servidor seguir o cdigo fonte:
package example.hello;

import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry ;
importjava.rmi.RemoteException ;
import classe java.rmi.server.UnicastRemoteObject;
public class Server implements Hello {
public Server() {}
public String sayHello () {
return "Ol, mundo!";
}
void main (args String []) {public static
experimentar {
Server obj = new Server ();
Hello stub = (Hello)
UnicastRemoteObject.exportObject (obj, 0);
// Vincular stub do objeto remoto no registro
Registry registro = LocateRegistry.getRegistry ();
registro.bind ("Ol", stub);
System.err.println ("Servidor pronto");
} Catch (Exception e) {
System.err.println ("Erro Server:" + e.toString());
e.printStackTrace ();
}
}
}
A classe de implementao do servidor implementa a interface remota
Hello, proporcionando uma implementao para o mtodo remoto
sayHello.
Nota: Uma classe pode definir mtodos no especificados na interface
remota, mas esses mtodos s pode ser invocada dentro da mquina virtual
executando o servio e no podem ser invocados remotamente.
Criar e exportar um objeto remoto
O principal mtodo de o servidor precisa para criar o objeto remoto que
fornece o servio. Alm disso, o objeto remoto deve ser exportado para o
tempo de execuo Java RMI para que ele pode receber chamadas remotas
de entrada. Isto pode ser feito como se segue:
Server obj = new Server ();

Hello stub = (Hello) UnicastRemoteObject.exportObject (obj, 0);


O mtodo esttico UnicastRemoteObject.exportObject exporta o objeto
remoto fornecido para receber entrada de mtodo remoto invocaes em
uma porta TCP annimo e retorna o stub para o objeto remoto para passar
para os clientes. Como resultado da chamada a ExportObject, o tempo de
execuo podem comear a ouvir sobre um novo socket servidor ou pode
usar um soquete de servidor compartilhado para aceitar chamadas remotas
de entrada para o objeto remoto. O stub retornado implementa o mesmo
conjunto de interfaces remotas como a classe do objeto remoto e contm o
nome do host e porta atravs da qual o objeto remoto pode ser contactado.
Nota: A partir do 5.0, release de J2SE, classes de stub para objetos remotos
no precisam mais ser pregerados usando o compilador de stub rmic, a
menos que o objeto remoto precise suportar clientes que executam em
versoes anteriores a 5.0. Se o seu aplicativo precisa apoiar esses clientes,
voc vai precisar para gerar classes de stub para os objetos remotos
utilizados na aplicao e implantar essas classes stub para os clientes para
fazer o download. Para obter detalhes sobre como gerar classes stub,
consulte a documentao ferramentas para rmic [Solaris, Windows].
Registre o objeto remoto com um registro de Java RMI
Para um clienteser capaz de chamar um mtodo em um objeto remoto, ele
deve primeiro obter um stub para o objeto remoto. Por bootstrapping, Java
RMI oferece uma API de registro para aplicaes, vinculando um nome de
stub de um objeto remoto, e os clientes devem procurar objetos remotos
por nome, a fim de obter suas instncias.
Um registro Java RMI um servio de nome simplificado que permite aos
clientes obter uma referncia para um objeto remoto. Em geral, um registro
usado (se houver) s para localizar o primeiro objeto remoto um cliente
precisa de usar. Ento, normalmente, que o primeiro objeto, por sua vez
fornecem suporte especfico do aplicativo para encontrar outros objetos.
Por exemplo, a referncia pode ser obtido como um parmetro para, ou a
partir de um valor de retorno, uma outra chamada de mtodo remoto.
Uma vez que um objeto remoto registrado no servidor, os clientes podem
procurar o objeto pelo nome, obter uma referncia objeto remoto, e em
seguida, chamar mtodos remotos do objeto.
O cdigo a seguir no servidor obtm um elemento para um registro e, em
seguida, utiliza o stub registro para ligar o nome "Ola" para stub do objeto
remoto em que o registro:

Registro Registro = LocateRegistry.getRegistry ();


registry.bind ("Ola", stub);
O mtodo esttico LocateRegistry.getRegistry, sem argumentos, retorna um
stub que implementa a interface remota java.rmi.registry.Registry e envia
invocaes ao registro no host local do servidor na porta de registro padro
de 1,099. O mtodo ento chamado no registro stub a fim de vincular stub
do objeto remoto para o nome "Ola" no registro.
Nota: A chamada para LocateRegistry.getRegistry simplesmente retorna
um stub apropriado para um registro. A chamada no verifica para ver se
um registro est atualmente em execuo. Se nenhum registro executado
na porta TCP 1099 do host local quando mtodo chamado, o servidor ir
falhar com um RemoteException.

Implementar o cliente
O programa cliente obtm um esboo para o registro no host do servidor, faz um
lookup objeto remoto pelo nome no registro e, em seguida, chama o sayHello mtodo
no objeto remoto usando o topo.
Aqui est o cdigo fonte para o cliente:
package example.hello;
java.rmi.registry.LocateRegistry importao;
java.rmi.registry.Registry importao;
public class Cliente {
Cliente privado () {}
void main (String [] args) {public static
Acolhimento String = (args.length <1)? Nulo: args [0];
experimentar {
Registro Registro = LocateRegistry.getRegistry
(host);
Ol stub = (Ol) registry.lookup ("Ol");
Resposta String = stub.sayHello ();
System.out.println ("resposta:" + resposta);
} Catch (Exception e) {
System.err.println ("exceo Client:" + e.toString
());
e.printStackTrace ();
}
}

}
Este cliente obtm o primeiro esboo para o registro chamando o esttico
LocateRegistry.getRegistry mtodo com o nome do host especificado na
linha de comando. Se nenhum nome de host for especificado, ento nulo
usado como o nome da mquina indicando que o endereo host local deve
ser usado.
Em seguida, o cliente invoca o mtodo remoto de pesquisa no topo do
Registro para obter o stub para o objeto remoto do registro do servidor.
Finalmente, o cliente chama a sayHello mtodo no stub do objeto remoto, o
que faz com que as seguintes aes para acontecer:
O tempo de execuo do lado do cliente abre uma conexo com o
servidor usando o host e informaes de porta em stub do objeto
remoto e, em seguida, serializa os dados de chamadas.
O tempo de execuo do lado do servidor aceita a chamada, envia a
chamada para o objeto remoto, e serializa o resultado (a seqncia de
resposta "Ol, mundo!") Para o cliente.
O tempo de execuo do lado do cliente recebe, deserializes, e
retorna o resultado para o chamador.
A mensagem de resposta retornado da chamada remota no objeto remoto
ento impresso para System.out.

Compilar os arquivos de origem


Os arquivos de origem para este exemplo pode ser compilado da seguinte forma:
javac -d DestDir Hello.java Server.java Client.java
onde DestDir o diretrio de destino para colocar os arquivos de classe
em.
Nota: Se o servidor precisa para suportar clientes em execuo no pr-5.0
VMs, em seguida, uma classe stub para a classe de implementao objeto
remoto precisa ser pregenerated usando o rmic compilador, e que classe de
stub precisa ser disponibilizado para os clientes para fazer o download.
Veja o tutorial base de cdigo para mais detalhes.

Iniciar o registro Java RMI, servidor e cliente


Para executar este exemplo, voc precisar fazer o seguinte:

Iniciar o registro do Java RMI


Inicie o servidor
Execute o cliente

Iniciar o registro do Java RMI


Para iniciar o registro, execute o rmiregistry comando no host do servidor.
Este comando no produz sada (quando bem sucedido) e geralmente
executado em segundo plano. Para obter mais informaes, consulte a
documentao ferramentas para rmiregistry[Solaris, o Windows].
Por exemplo, no (tm) Sistema Operacional Solaris:
rmiregistry &
Ou, em plataformas Windows:
iniciar rmiregistry
Por padro, o registro executado na porta TCP 1099. Para iniciar um
registro em uma porta diferente, especifique o nmero da porta a partir da
linha de comando. Por exemplo, para iniciar o registro na porta 2001 em
uma plataforma Windows:
iniciar rmiregistry 2001
Se o registro ser executado em uma porta diferente de 1099, voc
precisar especificar o nmero da porta nas chamadas
paraLocateRegistry.getRegistry no servidor e cliente classes. Por exemplo,
se o registro est sendo executado na porta 2001, neste exemplo, a chamada
para getRegistry no servidor seria:
Registro Registro = LocateRegistry.getRegistry (2001);
Inicie o servidor
Para iniciar o servidor, execute o servidor de classe usando o java comando
da seguinte forma:
No sistema operacional Solaris:
java -classpath classDir example.hello.Server &
Em plataformas Windows:
iniciar java -classpath classDir example.hello.Server

onde classDir o diretrio raiz da rvore de arquivo de classe (ver DestDir


na seo "Compilando os arquivos de origem").
A sada do servidor deve ser semelhante a este:
Servidor pronto
O servidor permanece em execuo at que o processo encerrado pelo
usurio (tipicamente por matar o processo).
Execute o cliente
Uma vez que o servidor est pronto, o cliente pode ser executado como se
segue:
java -classpath classDir example.hello.Client
onde classDir o diretrio raiz da rvore de arquivo de classe (ver DestDir
na seo "Compilando os arquivos de origem").
A sada do cliente a seguinte mensagem:
resposta: Ol, mundo!