RMI - Erro ao tentar acessar servidor

22 respostas
antoniosales

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

22 Respostas

P

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

antoniosales

Usei as dua maneiras e apareceu o mesmo erro.

L

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

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

P
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

tem que ser no servidor!

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

public class HelloImpl extends UnicastRemoteObject implements Hello{  
  
        private String nome;  
  
        public HelloImpl(String s) throws java.rmi.RemoteException {  
               super(1098);  
               nome = s;  
        }  

        ...
}
antoniosales

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

maior_abandonado

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

antoniosales

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();
               }
        }

}
L

Firewall no server?

antoniosales

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?

antoniosales

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();
               }
        }
}
maior_abandonado

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 ?

antoniosales
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.

antoniosales

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

L

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

RebeccaDias

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

antoniosales

tente

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

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

RebeccaDias

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

antoniosales

Veja a possibilidade de utilizar SOCKET no lugar de RMI.

RebeccaDias

Eu usava SOCKET, troquei justamente pelo fato do Rmi ser muito mais simples de se usar, massss estou vendo o contrário.

:frowning:

antoniosales

Estou sem um modelo, na empresa tenho um modelo de envio de dados atraves de sockets(cliente/servidor) bem simples, se vc aguarda, na segunda eu posto.

Antonio Sales

RebeccaDias

Tá jóia antonio, eu vou ficar no aguardo então, por favor nao esqueça hein…rsrsrs

Obrigada mais uma vez

Criado 22 de setembro de 2010
Ultima resposta 6 de out. de 2012
Respostas 22
Participantes 5