Passar Parametros via RMI

9 respostas
fabiano-under

Ola Pessol , sou iniciante no uso de RMI.

Onde estou com duvidas em certos pontos, com passar parâmentos de um cliente RMI para o Servidor responsavel por toda parte de logica de negocios e integração com Banco de dados.

Todos exemplo disponivel na internet que encrontrei, não demostra como passar estes valores.

Alguem poderia tirar minha duvida ou passar um exemplo.

grato pela atenção.

9 Respostas

lucascaton

Você vai passar os parâmetros nos métodos, como em um programa Java comum.
Lembre-se que vc tem que ter a mesma interface dos dois lados (cliente e servidor).

Veja um exemplo:

:arrow: MetodosRemotos.java:
/*
  Interface responsavel pela descricao do metodo remoto
  Indica qual o formato e nome do metodo que sera disponibilizado na rede.
*/

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MetodosRemotos extends Remote{
    long getDobro(long l) throws RemoteException;
}
:arrow: Servidor.java:
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

// Classe servidor responsavel pela implementacao do metodo remoto
// e pelo registro do metodo no registry
public class Servidor implements MetodosRemotos{

  public Servidor(){}

  // Implementacao do metodo que ficara disponivel remotamente
  public long getDobro(long l){
    return l*2;
  }

  public static void main(String args[]){
    try{
		Servidor obj = new Servidor(); // cria um novo objeto

		// Cria objeto stub que pode responder invocacoes remotas
		// esse objeto eh associado ao objeto que implementa o metodo
		// no caso obj que eh do tipo Servidor
		MetodosRemotos stub = (MetodosRemotos) UnicastRemoteObject.exportObject(obj, 0);

		// Cria um registry responsavel pelo cadastramento do stub no
		// servidor de registros (rmiregistry)
		// Associa o nome 'dobro' o metodo remoto, ou seja, o metodo getDobro
		// eh encontrado na rede com o nome 'dobro'
		Registry registry = LocateRegistry.getRegistry();
		registry.bind("dobro", stub);

		System.err.println("Servidor carregado.\nAguardando solicitações...");
    } catch (Exception e) {
		System.err.println("Exception: " + e.toString());
		e.printStackTrace();
	}
	}
}
:arrow: Cliente.java:
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Cliente{
	private Cliente(){}
	public static void main(String[] args){
	    //Carrega o ip do host dservidor através do argumento passado
	    String host = args.length==1?args[0]:null;
	    try {
			// Pega o stub do servidor no endereco definido em host
			// Caso host = null, indica que o servidor eh local
			Registry registry = LocateRegistry.getRegistry(host);
			// Invocacao do metodo remoto atraves do metodo lookup
			MetodosRemotos stub = (MetodosRemotos) registry.lookup("dobro");
			// Objeto stub responsavel por associar a interface remota
			// chama o metodo remoto 'getDobro'
			Long response = stub.getDobro((long)5);
			System.out.println("Resposta do servidor: " + response);
	    } catch (Exception e) {
			System.err.println("Client exception: " + e.toString());
			e.printStackTrace();
	    }
	}
}

Não esqueça que você precisa ter o rmiregistry rodando.
Pra iniciar ele no Windows:
[color=green]rmiregistry.exe[/color]
ou
[color=green]cd %JAVA_HOME%/bin
rmiregistry.exe[/color]

Pra iniciar ele no Linux:
[color=green]rmiregistry[/color]

fabiano-under

Caro Amigo
Quando rodo o Servidor da um mensagen de Erro:

Exception: java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:

java.net.ConnectException: Connection refused: connect

java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:

java.net.ConnectException: Connection refused: connect

at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)

at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)

at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)

at sun.rmi.server.UnicastRef.newCall(Unknown Source)

at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)

at Servidor.main(Servidor.java:30)

Caused by: java.net.ConnectException: Connection refused: connect

at java.net.PlainSocketImpl.socketConnect(Native Method)

at java.net.PlainSocketImpl.doConnect(Unknown Source)

at java.net.PlainSocketImpl.connectToAddress(Unknown Source)

at java.net.PlainSocketImpl.connect(Unknown Source)

at java.net.SocksSocketImpl.connect(Unknown Source)

at java.net.Socket.connect(Unknown Source)

at java.net.Socket.connect(Unknown Source)

at java.net.Socket.(Unknown Source)

at java.net.Socket.(Unknown Source)

at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)

at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)

 6 more
lucascaton

Só assim não dá pra saber. Cola seu código aqui.

Abraços

fabiano-under

Mais é o Exemplo que vc me passou, gera este erro.

lucascaton

Aqui está rodando.

Você deixou o rmiregistry rodando, ou seja, deixou ele num prompt separado?

Seu firewall está liberado pra usar RMI?

fabiano-under

Sim, quando rodo pela propria IDE dá aquele erro que já te passei.

Já via prompt DOS gera o seguinte erro


D:\Java\RMIParamentro>start rmiregistry

D:\Java\RMIParamentro>java Servidor

Exception: java.rmi.ServerException: RemoteException occurred in server thread;

nested exception is:

java.rmi.UnmarshalException: error unmarshalling arguments; nested excep

tion is:

java.lang.ClassNotFoundException: Servidor_Stub

java.rmi.ServerException: RemoteException occurred in server thread; nested exce

ption is:

java.rmi.UnmarshalException: error unmarshalling arguments; nested excep

tion is:

java.lang.ClassNotFoundException: Servidor_Stub

at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396

)

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)

at sun.rmi.transport.Transport$1.run(Transport.java:159)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.Transport.serviceCall(Transport.java:155)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:5

35)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTranspor

t.java:790)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport

.java:649)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec

utor.java:885)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor

.java:907)

at java.lang.Thread.run(Thread.java:619)

at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Stream

RemoteCall.java:255)

at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:

233)

at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)

at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)

at Servidor.main(Servidor.java:30)

Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested ex

ception is:

java.lang.ClassNotFoundException: Servidor_Stub

at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)

at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386

)

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)

at sun.rmi.transport.Transport$1.run(Transport.java:159)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.Transport.serviceCall(Transport.java:155)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:5

35)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTranspor

t.java:790)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport

.java:649)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec

utor.java:885)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor

.java:907)

at java.lang.Thread.run(Thread.java:619)

Caused by: java.lang.ClassNotFoundException: Servidor_Stub

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

at java.lang.ClassLoader.loadClass(ClassLoader.java:251)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Class.java:247)

at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:434)

at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)

at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)

at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)

at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.jav

a:197)

at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:157

5)

at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1

732)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)

 12 more

Grato pela Atenção

lucascaton

Vish cara, aqui funcionou. Testei apenas pelo dos.

Veja se nesse artigo tem algo que possa ajudar:
http://www.guj.com.br/java.tutorial.artigo.37.1.guj

fabiano-under

como que ele nao encontra-se o arquivo stub

BobCycler

Adicione a linha de comando após o try da classe Servidor e refaça o teste

java.rmi.registry.LocateRegistry.createRegistry(1099);

Criado 27 de setembro de 2008
Ultima resposta 12 de abr. de 2011
Respostas 9
Participantes 3