Rmi

3 respostas
M

tenho q criar uma comunicacao entre cliente - servidor pegar o valor recebido pelo servidor e enviar novamente a outro servido, ou seja o meu primeiro servidor se torna cliente e servido. apenas nao estou conseguindo pegar o valor recebido pelo servidor e envia-lo novamente…


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

public interface Mensageiro extends Remote

{

public void enviarMensagem( String msg ) throws RemoteException;

public String lerMensagem() throws RemoteException;

}

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class MensageiroImpl extends UnicastRemoteObject implements Mensageiro

{	

String valor_recebido;

public MensageiroImpl() throws RemoteException

{

super();

}
public void enviarMensagem( String msg ) throws RemoteException 
{
	valor_recebido = msg;
	System.out.println( msg );
}

public String lerMensagem() throws RemoteException
{
	return "This is not a Hello World! message";
}

}

import java.rmi.Naming;

import java.rmi.RemoteException;

import java.rmi.NotBoundException;

import java.net.MalformedURLException;

public class Sensor extends Thread
{
public void run ()
{
try
{
Mensageiro S1 = (Mensageiro)Naming.lookup(“rmi://127.0.0.1/sensorcontrole”);
System.out.println(S1.lerMensagem());
S1.enviarMensagem(“MSG SENSOR”);
}
catch( MalformedURLException e )
{
System.out.println();
System.out.println( "MalformedURLException: " + e.toString() );
}
catch( RemoteException e )
{
System.out.println();
System.out.println( "RemoteException: " + e.toString() );
}
catch( NotBoundException e )
{
System.out.println();
System.out.println( "NotBoundException: " + e.toString() );
}
catch( Exception e )
{
System.out.println();
System.out.println( "Exception: " + e.toString() );
}
}
}

import java.rmi.Naming;

import java.rmi.RemoteException;

import java.rmi.NotBoundException;

import java.net.MalformedURLException;
public class Controle extends Thread

{

String mensagem;

public Controle() //recebendo

{

try

{

Mensageiro C1 = new MensageiroImpl();

Naming.rebind(rmi://127.0.0.1:1099/sensorcontrole”,C1);

/o meu problema é quero pegar esse valor recebido e mandar pro atuador, mas nao estou conseguindo/

}
	catch(Exception e)
	{
		System.out.println("Error Controle: " + e);
	}
	
	try
	{
		Mensageiro AT1 = (Mensageiro)Naming.lookup("rmi://127.0.0.1/controleatuador");
		System.out.println(AT1.lerMensagem());
		AT1.enviarMensagem(valor.valor_recebido);
	}
	catch( MalformedURLException e )
	{
		System.out.println();
		System.out.println( "MalformedURLException: " + e.toString() );
	}
	catch( RemoteException e )
	{
		System.out.println();
		System.out.println( "RemoteException: " + e.toString() );
	}
	catch( NotBoundException e )
	{
		System.out.println();
		System.out.println( "NotBoundException: " + e.toString() );
	}
	catch( Exception e )
	{
		System.out.println();
		System.out.println( "Exception: " + e.toString() );
	}
}	

public void run(String[] args)
{
	new Controle();
}

}

public class Atuador extends Thread

{

public Atuador()

{

try

{

Mensageiro server_controle = new MensageiroImpl();

Naming.rebind(rmi://127.0.0.1:1099/controleatuador”,server_controle);

}

catch(Exception e)

{

System.out.println("Error Controle: " + e);

}

}

public void run(String args[])

{

new Atuador();

}

}

3 Respostas

B

Ola,

No caso, quem recebe a mensagem do cliente é o servico MensageiroImpl, mas vamos considerar umas coisas abaixo:

Vamos ver se entendi…

Vc precisa de:
Um serviço que seja implementado por dois servidores:
No teu caso: Controle e Atuador.

Quando o Servico de Mensagem do servidor Controle receber uma mensagem do cliente, vc precisa que ele repasse ao servidor Atuador.

É isto???

Bom, se for isto:
Considerando a sua interface Mensageiro;
Crie um MensageiroListener, assim:

public interface MensageiroListener{ public void resendMessage(String msg); }

E na sua classe MensageiroImpl, crie um atributo do listener criado acima, e o receba como parametro no cosntrutor.

No método enviarMensagem(String msg) da classe MensageiroImpl, após processar a mensagem… verifique se o listener é diferente de nulo, se não for notifique-o, chamando o resendMessage.

Faça o servidor Controle implementar a interface MensageiroListener, e quando ele for criar o servico MensageiroImpl, passeio no construtor.
O servidor Atuador não implementa a MensageiroListener, então passe null no construtor da MensageiroListener.

No servidor Atuador, ele não precisa estender Thread… a publicação do serviço pelo servidor é bom deixar em threadsafe, só publicar o servico do Mensageiro com um nome diferente, tal como controleatuador_atuador.

No servidor Controel, que tb não precisa estender Thread…, crie e publique o servico do Mensageiro, normalmente e faça o lookup do servico publicado pelo Atuador, mas a instancia deste serviço, vc aguarda, num atributo de classe, pois no metodo da interface MensageiroListener, que ele está implementando, este será invocado assim:

public class Controle...

  public void resendMessage(String msg){
    try{
      this.mensageiro.enviarMensagem(msg);
    }catch(Exception e){
      e.printStackTrace();
    }
   }

E prontim… só isto… lembrando que os tres tem que rodar um JVM diferentes… pra funfar legal…

B

Ola de novo…

Pelo que vi, so vc abstrair a parte que quem recebe a mensagem do cliente e o servico MensageiroImlpl, e a parte do listener.

M

Muito obrigado pelas dicas deram certos… Mas agora mais um duvida…
como eu sei qual arquivo q esta criando o Stub com o comando rmic seria onde possui UnicastRemoteObject?
e eu posso criar um pra cada thread e depois executar apenas um rmiregistry…
tipo:
rmic sensor
rmic atuador
rmic controle
e depois rmiregistry q ira executar todos…?
abracos…

Criado 1 de dezembro de 2006
Ultima resposta 3 de dez. de 2006
Respostas 3
Participantes 2