RMI - Erro ao tentar acessar servidor

Ola a todos,

É o seguinte não estou conseguindo fazer um acesso atraves de RMI, seguir esse tutorial: http://www.devmedia.com.br/articles/viewcomp.asp?comp=4493, quando executo os arquivo no mesmo diretorio e no mesmo computador não da erro.

O problema é quando envio o arquivo HelloImpl.class e Hello.class para o servidor, (eu tenho todas as permissões no servidor), lá o processo é executado, mas no cliente aparece o seguinte erro:

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.invoke(Unknown Source)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
        at $Proxy0.sayHello(Unknown Source)
        at remoto.HelloClient.main(HelloClient.java:20)
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.<init>(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
        ... 8 more

Abaixo segue os codigos:

import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;

public class HelloImpl extends UnicastRemoteObject implements Hello{

        private String nome;

        public HelloImpl(String s) throws java.rmi.RemoteException {
               super();
               nome = s;
        }

        public String sayHello() throws RemoteException {
               return "Estamos funcionando !!!";
        }

        public static void main(String[] args) {

               //System.setSecurityManager(new RMISecurityManager());
         Registry registry = null;
         /* inicia rmi */
         try {
             /* tenta iniciar o registro */
             registry = LocateRegistry.createRegistry(1099);

            } catch (RemoteException e) {
             /* se não conseguiu criar vê se está rodando */
             try {
                 registry = LocateRegistry.getRegistry();
             } catch (RemoteException e2) {
                 /* não conseguiu nem criar e nem há rodando, sai do programa */
                 System.err.println("Registro não pode ser inicializado");
                 System.exit(0);
             }
         }
               try {

                       HelloImpl obj = new HelloImpl("HelloServer");

                       Naming.rebind("HelloServer", (Remote) obj);
                       System.out.println("HelloImpl foi criado e registrado");
               }

               catch(Exception e) {
                       System.out.println("Ocorreu uma exceção no servidor");
                       e.printStackTrace();
               }
        }
}
public interface Hello extends java.rmi.Remote {
        String sayHello() throws java.rmi.RemoteException;
}
import java.rmi.*;

public class HelloClient{
        public HelloClient(){
        }
	public static void main(String[] args) {

        String mensagem = "";

               try {

                        Hello obj = (Hello) Naming.lookup("rmi://192.168.0.215:1099/HelloServer" );
                        mensagem = obj.sayHello();
                        System.out.println(mensagem);
               }catch(Exception e) {
                       System.out.println("Ocorreu uma exceção");
                       e.printStackTrace();
               }
        }

}

Agradeço antecipadamente quem puder me ajudar.

Antonio

Você tem que informar o IP do servidor. IP real do servidor!

ex:

System.setProperty( "java.rmi.server.hostname", "200.100.xxx.21" );

ou

java -jar MyJar.jar … -Djava.rmi.server.hostname=200.100.xxx.21

Usei as dua maneiras e apareceu o mesmo erro.

[quote=plic_ploc]Você tem que informar o IP do servidor. IP real do servidor!

ex:

System.setProperty( "java.rmi.server.hostname", "200.100.xxx.21" );

ou

java -jar MyJar.jar … -Djava.rmi.server.hostname=200.100.xxx.21[/quote]

Deve ser informado o endereço que será utilizado pelos clientes para fazer lookup. No caso, no server fica:

   try {   
  
                       HelloImpl obj = new HelloImpl("HelloServer");   
                       System.setProperty( "java.rmi.server.hostname", "192.168.0.215" );

                       Naming.rebind("HelloServer", (Remote) obj);   
                       System.out.println("HelloImpl foi criado e registrado");   
               }   
  
               catch(Exception e) {   
                       System.out.println("Ocorreu uma exceção no servidor");   
                       e.printStackTrace();   
               }   

Isso é necessário porque o RMI registra o Objeto Remoto em uma subrede específica. No seu caso, ele está registrando no IP 127.0.0.1. Como o client não tem acesso a este endereço, dá erro. System.setProperty( "java.rmi.server.hostname", "192.168.0.215" ); Fará com que o objeto seja registra no endereço que o cliente tem acesso.

Abraços

[quote]Você tem que informar o IP do servidor. IP real do servidor!

ex:
view plaincopy to clipboardprint?
System.setProperty( “java.rmi.server.hostname”, “200.100.xxx.21” );

ou

java -jar MyJar.jar … -Djava.rmi.server.hostname=200.100.xxx.21[/quote]

tem que ser no servidor!

além disso, ficaria melhor se você informar uma porta. Ex:

[code]public class HelloImpl extends UnicastRemoteObject implements Hello{

    private String nome;  

    public HelloImpl(String s) throws java.rmi.RemoteException {  
           super(1098);  
           nome = s;  
    }  

    ...

}
[/code]

Fiz todas as modificações que me pediram aqui, no servidor executa tranquilamente, mas o cliente não, vem a mesma Exception

no cliente, vc esta usando o mesmo endereço ip no lookup que foi usado no servidor ao dar o bind?

Segue o codigo que estou usando no cliente

import java.rmi.*;

public class HelloClient{

	public static void main(String[] args) throws java.net.UnknownHostException {

        String mensagem = "";
        
               try {
                        
                        Hello obj = (Hello) Naming.lookup("rmi://192.168.0.215:1099/HelloServer" );
                        mensagem = obj.sayHello();
                        System.out.println(mensagem);
               }catch(Exception e) {
                       System.out.println("Ocorreu uma exceção");
                       System.out.println (java.net.InetAddress.getLocalHost() );
                       e.printStackTrace();
               }
        }

}

Firewall no server?

Não
é um servidor somente para teste
só tem acesso pela rede local, então não tem regras de acesso, acesso ele via FTP, HTTP, SSH, Telnet
porem executo o arquivo no servidor como root
DHCP influi?

Aqui ta o codigo rodando no servidor

import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;

public class HelloImpl extends UnicastRemoteObject implements Hello{

        private String nome;

        public HelloImpl(String s) throws java.rmi.RemoteException {
               super();
               nome = s;
        }

        public String sayHello() throws RemoteException {
               return "Estamos funcionando !!!";
        }

        public static void main(String[] args) {

               //System.setSecurityManager(new RMISecurityManager());
         Registry registry = null;
         /* inicia rmi */
         try {
             /* tenta iniciar o registro */
             registry = LocateRegistry.createRegistry(1099);

            } catch (RemoteException e) {
             /* se não conseguiu criar vê se está rodando */
             try {
                 registry = LocateRegistry.getRegistry();
             } catch (RemoteException e2) {
                 /* não conseguiu nem criar e nem há rodando, sai do programa */
                 System.err.println("Registro não pode ser inicializado");
                 System.exit(0);
             }
         }
               try {

                       HelloImpl obj = new HelloImpl("HelloServer");
                      // HelloImpl stub = (HelloImpl) UnicastRemoteObject.exportObject(obj, 0);
                       registry.bind("HelloServer", obj);
                       System.setProperty( "java.rmi.server.hostname", "192.168.0.215" );
                       Naming.rebind("HelloServer", (Remote) obj);
                       System.out.println("HelloImpl foi criado e registrado");
               }

               catch(Exception e) {
                       System.out.println("Ocorreu uma exceção no servidor");
                       e.printStackTrace();
               }
        }
}

e o stack trace que esta ocorrendo? continua igual? posta ele ai vc consegue da um ping … da máquina client no ip 192.168.0.215 ?

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(TCPEndpoint.java:601)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:110)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
        at $Proxy0.sayHello(Unknown Source)
        at remoto.HelloClient.main(HelloClient.java:20)
Caused by: java.net.ConnectException: Connection refused: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
        ... 7 more

Disparando contra 192.168.0.215 com 32 bytes de dados:

Resposta de 192.168.0.215: bytes=32 tempo<1ms TTL=64
Resposta de 192.168.0.215: bytes=32 tempo<1ms TTL=64
Resposta de 192.168.0.215: bytes=32 tempo<1ms TTL=64
Resposta de 192.168.0.215: bytes=32 tempo<1ms TTL=64

Estatísticas do Ping para 192.168.0.215:
Pacotes: Enviados = 4, Recebidos = 4, Perdidos = 0 (0% de perda),
Aproximar um número redondo de vezes em milissegundos:
Mínimo = 0ms, Máximo = 0ms, Média = 0ms

Lembrando que quando eu executo os arquivos na maquina local, não dá erro.

Alterei essa linha no cliente

Registry registry = LocateRegistry.getRegistry("192.168.0.215", 1099);
Hello obj = (Hello) Naming.lookup("rmi://192.168.0.215:1099/HelloServer");
mensagem = obj.sayHello();
System.out.println(mensagem);

e continua o mesmo erro

A chave da questão está na primeira linha do stack trace:

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

O client não está conseguindo conversar com o objeto registrado em “127.0.0.1”. Isto significa que o server criou o objeto neste IP e não no 192.168.0.215 que é o que deveria.

Substitua o main do server pelo seguinte:


	public static void main(String[] args) throws RemoteException,
			MalformedURLException, AlreadyBoundException {
                System.setProperty( "java.rmi.server.hostname", "192.168.0.215" ); 
  	LocateRegistry.createRegistry(1099);
                  HelloImpl obj = new HelloImpl("HelloServer");   
                      Naming.bind("HelloServer", (Remote) obj);   
                       System.out.println("HelloImpl foi criado e registrado");   
	}

Abraços

Bom Dia, eu também estou tentando rodar minha aplicação e também está dando erro do tipo:
Erro:java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.rmi.ConnectException: Connection refused to host: localhost; nested exception is:
java.net.ConnectException: Connection refused: connect
java.net.ConnectException: Connection refused: connect

O meu CLIENTE roda normalmente, mas quando vai acessar o SERVIDOR, dá esse erro.
:frowning:
Já tentei fazer várias coisas e mesmo assim ainda não consegui, se alguem puder me ajudar, ficarei muito Feliz.
Abaixo segue meu código,
Bjos,
Rebecca

SERVIDOR

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rmi;
import java.rmi.Naming;
	import java.rmi.RemoteException;
	 
/**
 * 
 * @author Rebecca
 */
public class Servidor
	{
            /**
             * 
             * @throws RemoteException
             */
            public Servidor() throws RemoteException
	    {
	        String localServico = "rmi://localhost:1099/InterfaceCalculoRemoto";
	        InterfaceCalculoRemoto objServidorRemoto = new ImplementacaoCalculoRemoto();
	 
	        try
	        {
	             Naming.rebind(localServico, objServidorRemoto);
	        }
	        catch (Exception e)
	        {
	             e.printStackTrace();
	        }
	     }
	 
            /**
             * 
             * @param args
             * @throws RemoteException
             */
            public static void main(String[] args) throws RemoteException
	        {
	              Servidor objServidor = new Servidor();
	        }
	}

CLIENTE

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rmi;

import java.net.MalformedURLException;
	import java.rmi.Naming;
	import java.rmi.NotBoundException;
	import java.rmi.RemoteException;
	import javax.swing.JOptionPane;

	 
/**
 * 
 * @author Rebecca
 */
public class Cliente {
	 
    /**
     * 
     * @param args
     */
    public static void main(String[] args)
	    {
	        try {
	               int val1 = Integer.parseInt(JOptionPane.showInputDialog("Entre com o primeiro valor"));
	               String opcao[] = {"+", "-", "*", "/"};
	 
	               int operacao = JOptionPane.showOptionDialog(null, "Escolha uma das operacoes", "Tipo de operacao",
	               0, JOptionPane.INFORMATION_MESSAGE, null, opcao, opcao[0]);
	 
	               int val2 = Integer.parseInt(JOptionPane.showInputDialog("Entre com o segundo valor"));
	 
	               InterfaceCalculoRemoto objCalculoRemoto = (InterfaceCalculoRemoto)Naming.lookup("rmi://localhost:1099/InterfaceCalculoRemoto");
	 
	               System.out.println("Servidor fala: O resultado é = " + objCalculoRemoto.metodo_calcular(val1, val2, operacao));
	               objCalculoRemoto.mensagemServidor("Recebi a Resposta");
             }
	 
	            catch (MalformedURLException e)
	            {
	                    System.out.println("Erro:" + e.toString());
	                    e.printStackTrace();
	            }
	            catch (RemoteException e)
	            {
	                    System.out.println("Erro:" + e.toString());
	                    e.printStackTrace();
	                }
	            catch (NotBoundException e)
	            {
	                    System.out.println("Erro:" + e.toString());
	                    e.printStackTrace();
	                }
	            catch (Exception e)
	            {
	                    JOptionPane.showMessageDialog(null, "Entrada inválida", e.getMessage(), JOptionPane.ERROR_MESSAGE);
	                    System.exit(-1);
	            }
	    }
}

IMPLEMENTAÇÃO CALCULOREMOTO

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rmi;

import java.rmi.RemoteException;
	import java.rmi.server.UnicastRemoteObject;
	 
/**
 * 
 * @author Rebecca
 */
public class ImplementacaoCalculoRemoto extends UnicastRemoteObject implements InterfaceCalculoRemoto
	{
    
    /**
     * 
     * @throws RemoteException
     */
    public ImplementacaoCalculoRemoto() throws RemoteException
	    { }
	 
            /**
             * 
             * @param mensagem
             * @throws RemoteException
             */
    @Override
            public void mensagemServidor(String mensagem) throws RemoteException
	{
	      System.out.println("Cliente fala: " + mensagem);
	}
	 
            /**
             * 
             * @param val1
             * @param val2
             * @param op
             * @return
             * @throws RemoteException
             */
    @Override
            public double metodo_calcular(int val1, int val2, int op) throws RemoteException
	{
	   double v1 = Double.valueOf(String.valueOf(val1));
	   double v2 = Double.valueOf(String.valueOf(val2));
	 
	      if (op == 0)
	      {
	          return (v1 + v2);
	      }
	      else
	          if (op == 1)
	          {
	              return (v1 - v2);
	          }
	          else
	              if (op == 2)
	              {
	                  return (v1 * v2);
	              }
	              else
	                   if (op == 3)
	                   {
	                       return (v1 / v2);
	                    }
	     return 0;
	  }
}

INTERFACE CALCULOREMOTO

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rmi;

import java.rmi.Remote;
	import java.rmi.RemoteException;
	 
/**
 * 
 * @author Rebecca
 */
public interface InterfaceCalculoRemoto extends Remote
	{
            /**
             * 
             * @param val1
             * @param val2
             * @param operacao
             * @return
             * @throws RemoteException
             */
            public double metodo_calcular(int val1, int val2, int operacao) throws RemoteException;
            /**
             * 
             * @param mensagem
             * @throws RemoteException
             */
            public void mensagemServidor(String mensagem) throws RemoteException;
	}

Fico no aguardo, Obrigada

tente

 String localServico = "rmi://127.0.0.1:1099/InterfaceCalculoRemoto";  

Olá AntonioSales, fico feliz por ter respondido.
Então eu já tentei fazer isso, mas mesmo assim continua dando o erro que mencionei.
:frowning:
Eu abri o cmd e digitei “java rmi.Servidor” e tbem deu erro do tipo “Não foi possível localizar nem carregar a classe principal rmi.Servidor”. De fato não sei mais o que eu faço…rsrs.
Sou novata nisso, acho que até da pra perceber pelo exemplo do trabalho que fiz…rsrs. O que eu fiz, foi o seguinte, fiz esses programinhas em netbeans, selecionei o arquivo e coloquei pra executar (não sei se só tem isso pra ser feito ou se tem mais alguma coisa), primeiro selecionei o cliente e executei, ele roda perfeitamente, quando o cliente envia a mensagem para o servidor que aparece esse erro. Já desabilitei meu firewall e mesmo assim dá erro. Eu li que teria de ir no cmd e fazer algumas coisas, mas nem sei como faço isso. De fato, nao sei o que fazer, se puder passar “passo a passo” pra mim, ficarei extremamente grata. Imagine que só criei os arquivos no netbeans e coloquei pra executar, como se eu estivesse feito um aplicativo desktop normal, onde crio as classes e depois de tudo pronto, só coloco pra executar e é aberto normalmente. Com o Rmi, sei que nao é somente isso, preciso de mais coisas, mas onde vou? como faço pra startar o servidor? o que preciso fazer para rodar essa simples aplicação? Me ajude, please…rsrsrs

Só pra complementar, eu abri o cmd e fui nos diretórios da pasta do netbeansprojects tentei fazer o registro do rmi, apareceu que “esse comando não é reconhecido como comando interno ou externo, um programa operável ou um arquivo em lotes”.

:frowning:

Acredito que o erro não estão nas minhas classes, acho que está na forma de fazer rodar o rmi. De verdade, não sei o que fazer…rsrsr
O netbeans já compilou o arquivo, ja abri o cmd, fui nos diretórios, mas na hora de tentar fazer o rmiregistry, aparece o erro acima.

:frowning:

Como faço pra rodar isso??? Me ajudemmmmm…rsrsrs

Veja a possibilidade de utilizar SOCKET no lugar de RMI.