Bom dia pessoal - Iniciante Java RMI

Estou iniciando Java RMI

E estou fazendo um programa para poder aprender como funciona fiz algumas coisas na faculdade tambem, mas estou com um problema quando vou executar meu servidor ele da a seguinte mensagem:

java.net connectException: connection refused to host: localhost
como resolvo este problema? alguem pode me ajudar?
não consigo fazer fucionar o projeto.
Obrigado a todos desde ja
Leandro Santos
Abaixo segue o código de todo o projeto:

================================================

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;

public class Servidor 
{
	public static void main(String[] args)
	{
		try
		{
			Aluno a1 = new Aluno();
			Naming.rebind("//localhost/Aluno",a1);
			System.out.println("Objeto aluno publicado...");
		}
		catch(Exception e)
		{
			System.out.println("Erro: " + e.getMessage());
		}
	}
}

================================================

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;

public interface IAluno extends Remote
{
	public void setNome(String n) throws RemoteException;
	public void setRgm(int r) throws RemoteException;
	public String getNome() throws RemoteException;
	public int getRgm() throws RemoteException;
	public void setMed1(double m) throws RemoteException;
	public void setMed2(double m) throws RemoteException;
	public double getMed1() throws RemoteException;
	public double getMed2() throws RemoteException;
	public double getMedf() throws RemoteException;
	public void calcularMedf() throws RemoteException;
	public String situacao() throws RemoteException;
	public void criar (int r, String n, double m1, double m2) throws RemoteException;
}

================================================

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;


//classe Aluno é derivada de UnicastRemoteObject
//classe Aluno implementa IAluno
public class Aluno extends UnicastRemoteObject implements IAluno
{
	//atributos
    private int rgm;
	private String nome;
	private double med1;
	private double med2;
	private double medf;
	
	//construtor
	public Aluno() throws RemoteException 
	{}
	
	//métodos de acesso
	public void setNome(String n) throws RemoteException
	{
		nome = n;
	}
	public void setRgm(int r) throws RemoteException
	{
		rgm = r;
	}
	public String getNome() throws RemoteException
	{
		return nome;
	}
	public int getRgm() throws RemoteException
	{
		return rgm;
	}
	public void setMed1(double m) throws RemoteException
	{
		med1 = m;
	}
	public void setMed2(double m) throws RemoteException
	{
		med2 = m;
	}
	public double getMed1() throws RemoteException
	{
		return med1;
	}
	public double getMed2() throws RemoteException
	{
		return med2;
	}
	public double getMedf() throws RemoteException
	{
		return medf;
	}
	//calculo do valor de média final
	public void calcularMedf() throws RemoteException
	{
		medf = (med1+med2)/2;
	}
	public String situacao() throws RemoteException
	{
		String sit = "";
		if (medf >= 5)
		{
			sit = "Aprovado";
		}
		else 
		{
			sit = "Reprovado";
		}
		return sit;
	}
	public void criar (int r, String n, double m1, double m2) throws RemoteException
	{
		rgm = r;
		nome = n;
		med1 = m1;
		med2 = m2;
	}
}

================================================

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;

public class Cliente
{
	public static void main(String[] args)
	{
		try
		{
			IAluno a = (IAluno)Naming.lookup("aluno");
			
			//a.setMed1(5);
			//a.setMed2(7);
			//a.setNome("Maria");
			//a.setRgm(123);
			
			
			a.criar(123,"Maria",5,9);
			
			
			a.calcularMedf();
			
			


			System.out.println("Nome: " + a.getNome());
			System.out.println("RGM: " + a.getRgm());
			System.out.println("Media1: " + a.getMed1());
			System.out.println("Media2: " + a.getMed2());
			System.out.println("Media final: " + a.getMedf());
			System.out.println("Media2: " + a.situacao());
			


		}
		catch(Exception e)
		{
			System.out.println("Erro: " + e.getMessage());
		}
		
	}
}

================================================

Você iniciou o rmiregistry?

[quote=leandrosantos]Estou iniciando Java RMI

E estou fazendo um programa para pode aprender como funciona fiz algumas coisas na faculdade tambem, mas estou com um problema quando vou executar meu servidor ele da a seguinte mensagem:

java.net connectException: connection refused to host: localhost
como resolvo este probela? alguem pode me ajudar?
não consigo fazer fucionar o projeto.
Obrigado a todos desde ja
Leandro Santos
Abaixo segue o código de todo o projeto:

[/quote]
Já viu se firewall da sua máquina libera a porta no RMI, que eu não lembro qual é :slight_smile:

Bom eu uso assim e dá certo.

[code]

import java.util.ArrayList;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.AlreadyBoundException;
import java.rmi.server.UnicastRemoteObject;
import java.io.IOException;
import java.rmi.Naming;
import java.net.MalformedURLException;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedReader;

public class ServidorImpl implements Servidor{

public ServidorImpl(){
	inicia();
}

public void inicia(){
	try{
		//exporta o objeto remoto
		Servidor stub = (Servidor)UnicastRemoteObject.exportObject(this,0);
		
		//liga o stub do objeto remoto no registro, e inicia o RMIRegistry na porta 1000
		Registry registry = LocateRegistry.createRegistry(1000);
		
		//dá um nome pra ele no registro
		registry.bind("Servidor", stub);
		
		System.out.println("Servidor iniciado...");
	}catch(RemoteException  re){
		System.out.println(re.getMessage());
	}catch(AlreadyBoundException abe){
		System.out.println(abe.getMessage());
	}catch(IOException ioe){
		System.out.println(ioe.getMessage());
	}
}
    
public static void main(String[] arg){
 	 try{

	         ServidorImpl objt = new ServidorImpl();

                     Naming.rebind("rmi://127.0.0.1/Servidor", objt);
                     System.out.println("Servidor Rodando...");
	 }catch(MalformedURLException murl) {
                   System.out.println("a URL nao foi encontrada.");
                   murl.getMessage();
	 }catch(RemoteException re){
	 	
	 }
}

}[/code]

Quando fiz um sistema em RMI dava o seguinte erro, na primeira vez q eu executava dava certo o servidor ficava aguardando a conexão, se eu parasse a execução do servidor e depois executa-se novamente ele ñ esperava a conexão e finalizava o programa, agora com esse codigo eu resolvi o problema. Espero q ajude e qualquer duvida posta ai. Valeu.

Desculpe a minha ignorancia, mas não iniciei o rmiregistry como faço isso?
o Firewall está dastivado.

Desculpe a minha ignorancia, mas não iniciei o rmiregistry como faço isso?
o Firewall está dastivado.[/quote]
Com o codigo q eu te mandei ñ precisa registrar o rmiregistry.
Eh só executar esse codigo e dá tudo certo. Vc já tentou?
Qualquer coisa só para efeito de aprendizagem para iniciar o rmiregistry:
1-Abra o cmd.
2- Entre no diretorio bin do jdk.
3- Digite rmic -v1.2 Servidor(“Servidor é o nome da classe q contem o codigo do servidor rmi”)
4- Digite rmiregistry e deixe a janela do prompt aberta.
Pronto espero q tenha ajudado. Valeu.

Hummm entendi.
Agora quando tento executar o comando rmic -v1.2 Servidor
ele da o seguinte erro:

C:\j2sdk1.4.2_17\bin>rmic -v1.2 Servidor
error: Class Servidor not found.
1 error

Depois executo esse comando ele funciona:

C:\j2sdk1.4.2_17\bin>rmiregistry

E quando tento executar a minha classe Servidor ele da este erro:

Erro: RemoteException occurred in server thread; nested exception is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
        java.lang.ClassNotFoundException: IAluno

O que poderia ser??

[quote=leandrosantos]Hummm entendi.
Agora quando tento executar o comando rmic -v1.2 Servidor
ele da o seguinte erro:

C:\j2sdk1.4.2_17\bin>rmic -v1.2 Servidor
error: Class Servidor not found.
1 error

Depois executo esse comando ele funciona:

C:\j2sdk1.4.2_17\bin>rmiregistry

E quando tento executar a minha classe Servidor ele da este erro:

Erro: RemoteException occurred in server thread; nested exception is:
        java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
        java.lang.ClassNotFoundException: IAluno

O que poderia ser??
[/quote]

Vc resolve isso colocando o arquivo q contem sua classe na pasta do jdk. Ou então vc copia os executaveis q estão dentro da pasta jdk chamados rmic e rmiregistry e copia na pasta q contem os arquivos dos codigos de seu programa. Fazendo isso fica tudo blz. Valeu. Qualquer coisa posta ai.

Boa Noite Galera.
Valeu pelas respostas, ajudou muito.
Estou muito contente com o grupo e o pessoal.
Tenho sanado minhas duvidas e galera da bastante atenção.
Muito Obrigado mesmo, pelo que posso perceber vou aprender muito aqui.
E com certeza vou ajudar no que for possivel
Obrigado Galera, abração t+

Olha, não quero menosprezar a idéia do amigo, mas essa história de copiar arquivos do JDK para seu folder não é uma boa, e muito menos resolver problemas de CLASSPATH compilando suas classes no diretório da JDK(!!!)…

Gambiarras desse tipo não são legais hein…

Para iniciar o rmiregistry, basta abrir um prompt e digitar:

rmiregistry

E se quiser uma porta específica:

rmiregistry 1000

Assim seu programa funciona numa boa… se quiser implementar algo como o programa para exibir alguma mensagem dizendo que está rodando o RMIRegistry, configure o seu path e NÃO copie nada da JDK… é mais melhor de bom… :slight_smile:

Meio fora do assunto mas, por que cada método atira um RemoteException?

Pelo fato de, se seu cliente(stub) tentar executar o método e este não for encontrado, por exemplo, ele tem que esperar uma RemoteException (checked exception)…