RemoteException: java.rmi.UnknownHostException

8 respostas
java
fabio.kisner

Estou fazendo um servidor RMI, dentro da rede do cliente funciona a comunicação entre a maquina cliente e o servidor.
O Problema que a maquina cliente ficara fora da rede e ira acessar pelo domino.dyndns.

Ele faz a conexão, mas não reconhece a função ler mensagem
Meu objeto
Proxy[Mensageiro,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:dominio.dyndns-office.com:1043:35645,objID:[60fe353c:17015be3dcf:-7fff, 7510163254941963883]]]]]

Nesta caso da o erro:
RemoteException: java.rmi.UnknownHostException: Unknown host:dominio.dyndns-office.com:1043;

Codigo do meu servidor

public class MensageiroServer {

public MensageiroServer() {

try {

Mensageiro m = new MensageiroImpl();

Naming.rebind(rmi://localhost:1098/MensageiroService”, m);
System.out.println( "subiu servidor rmi no host: " +  InetAddress.getLocalHost().getHostName() ); 
         } 
         catch( Exception e ) { 
             System.out.println( "Trouble: " + e ); 
         } 
     } 
  
public static void main(String[] args) { 

	Registry registry = null;
	try{
		
		System.setProperty("java.rmi.server.hostname", "dominio.dyndns-office.com:1043");
		System.setProperty("sun.rmi.transport.connectionTimeout", "50000");
		
		registry = LocateRegistry.createRegistry(1098);
		registry = LocateRegistry.getRegistry("dominio.dyndns-office.com:1043",1098);
		

		System.out.println(registry);
		
		
		

	}catch (Exception e2) {
      
		e2.printStackTrace();
        System.err.println("Registro não pode ser inicializado:"+e2.getMessage());
        System.exit(0);
    }


	new MensageiroServer(); 
} 

}

Meu cliente
public class MensageiroClient {

public MensageiroClient() {
	// TODO Auto-generated constructor stub
}
 public static void main( String args[] ) { 
	 try { 
        			Mensageiro m = (Mensageiro) Naming.lookup( "rmi://dominio.dyndns-office.com:1043/MensageiroService" );
// o erro ocorre na linha abaixo

System.out.println( m.lerMensagem() );

m.enviarMensagem(Hello World);
} 
      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() ); 
      } 
 }

}

8 Respostas

PedreiroDeSoftware

Excessao de host desconhecido.

Esse host funciona na porta 1043?

fabio.kisner

Sim nesta porta, dentro da rede do cliente funciona, so nao funciona pelo acesso externo via dyndns

PedreiroDeSoftware

Faça o ckeck list desse tutorial:

https://www.tp-link.com/br/support/faq/297/

O firewall foi liberado para acesso externo?

fabio.kisner

sim

fabio.kisner

O redirecionamento funciona, pois pelo codigo que descrevi ele executa o comando:
Mensageiro m = (Mensageiro) Naming.lookup( “rmi://dominio.dyndns-office.com:1043/MensageiroService” );
Inclusive retornando o objeto
Proxy[Mensageiro,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:dominio.dyndns-office.com:1043:35645,objID:[60fe353c:17015be3dcf:-7fff, 7510163254941963883]]]]]

Mas quando executo o metodo lerMensagem() ele da o erro

PedreiroDeSoftware

Na linha seguinte a porta informada na string está diferente da numérica:

É isso mesmo?

No cliente vc lança a porta 1043, mas no servidor a 1098 .

Essas portas em string não batem, não fazem sentido.

Essas portas estão corretas?

Se vc levanta o servidor na 1098, o cliente também tem que apontar para a porta 1098 e não para a 1043.

fabio.kisner

Bom dia, no servidor de hospedagem, a porta de saída 1098 é bloqueada, então ele sai pela 1043, mas é redirecionada para a porta 1098. Isso também funciona, dentro da rede do cliente acessamos dessa forma. O problema é quando é feito via dyndns. Mas veja só. No meu computador tenho duas placas de rede. Uma normal e outra exclusiva para a rede interna do cliente. No começo dos teste funcionava, mas acontecia o seguinte. Quando conectava ele retornava o endpoint o ip do servidor do cliente , no caso 10.0.0.12. Então quando eu testava pela minha maquina funcionava, pois eu tinha acesso as duas redes. Acessava pelo dyndns, ele retornara o endpoint 10.0.0.12, mas como tinha acesso a rede dava certo. No caso do servidor externo, ele obviamente não acessa a rede do cliente. Dava erro que o host 10.0.0.12 não era acessivel. Demorei para descobrir que tinha que por a linha
System.setProperty(“java.rmi.server.hostname”, “lineaverde.dyndns-office.com:1043”);
Desde então o endpoint funciona, conecta, mas da time out na execução.

j-menezes

No passado já tive problema parecido com o que você está tendo que lidar agora, lembro que na época bateu um certo desespero, pois foi um erro que não estava esperando.
Depois de pesquisar aqui e ali e nada encontrar, nem mesmo na falecida SUN, resolvi procurar um RMI de terceiro e encontrei, mas não gostei e acabei desenvolvendo o meu.
Pra mim foi mais rapido desenvolver um do que fuçar todo o sistema operacional e esperar que alguem no forum pudesse me ajudar.

Mas o resultado compensou, ficou mais rapido que o RMI da Sun e me atendeu perfeitamente.

Esse problema do RMI teria mesmo que falar com o desenvolvedor dele e ver o que tem que fazer pra resolver isso.

Criado 5 de fevereiro de 2020
Ultima resposta 7 de fev. de 2020
Respostas 8
Participantes 3