Foros del Web » Programación para mayores de 30 ;) » Java »

No puedo ejecutar un método de un objeto remoto en RMI

Estas en el tema de No puedo ejecutar un método de un objeto remoto en RMI en el foro de Java en Foros del Web. Hola amigos javeros. Estoy empezando a trabajar con RMI. Cuando pruebo todo desde dentro de la misma LAN, funciona sin problemas, pero cuando lo ejecuto ...
  #1 (permalink)  
Antiguo 06/10/2011, 16:23
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Pregunta No puedo ejecutar un método de un objeto remoto en RMI

Hola amigos javeros.

Estoy empezando a trabajar con RMI. Cuando pruebo todo desde dentro de la misma LAN, funciona sin problemas, pero cuando lo ejecuto en 2 conexiones diferentes, ahí se me produce el error. Los pasos realizados son los siguientes:
1.- Inicio el rmiregistry en el servidor.
2.- Ejecuto el jar del servidor en el servidor, quien registra el objeto en el rmiregistry
3.- Cuando ejecuto el cliente desde la otra red, me da una excepción en el cliente.
Les paso toda la info que creo pertinente. Si necesitan más info, la pongo.
InterfaceRemota:
Código:
public interface InterfaceRemota extends Remote {
    public List<ResumenCuentaSocioLinea> suma (int codigoDesde, int codigoHasta, long fechaDesde, long fechaHasta, boolean verContado) throws RemoteException;
}
ObjetoRemoto:
Código:
public class ObjetoRemoto extends UnicastRemoteObject implements InterfaceRemota{
    public ObjetoRemoto () throws RemoteException{
        super();
    }
    public List<ResumenCuentaSocioLinea> suma (int codigoDesde, int codigoHasta, long fechaDesde, long fechaHasta, boolean verContado) throws RemoteException{
        System.out.println("Procesando datos...");
        List<ResumenCuentaSocioLinea> resumen = new ArrayList<ResumenCuentaSocioLinea>();
        // ACA CON LOS RANGOS RECIBIDOS OBTENGO LOS DATOS A DEVOLVER DESDE LA BASE DE DATOS
        System.out.println("Enviando datos...");
        return resumen;
    }
}
Servidor:
Código:
public class Servidor {
    public Servidor() {
        try {
            System.setProperty("java.rmi.server.codebase", "file:/C:/RMI/RMIServidor/src/");
            String host = java.net.InetAddress.getLocalHost().getHostAddress();
            System.out.println("Iniciando Servidor... " + host);
            InterfaceRemota objetoRemoto = new ObjetoRemoto();
            Naming.rebind ("//" + host + ":1099/ObjetoRemoto", objetoRemoto);
            System.out.println("Servidor iniciado");
        }
        catch (Exception e){
            e.printStackTrace();
            System.out.println("Error al iniciar el Servidor");
        }
    }

    public static void main(String[] args) {
        new Servidor();
    }
}
Cliente:
Código:
public class Cliente {
    public Cliente() {
        try{
            System.out.println("Estableciendo conexión...");
            InterfaceRemota objetoRemoto = (InterfaceRemota)Naming.lookup ("//186.130.XX.XXX:1099/ObjetoRemoto");
            System.out.println("Obteniendo resumen de cuenta...");
            List<ResumenCuentaSocioLinea> resumen = objetoRemoto.suma(1, 500, 20010101, 20113112, true);
            System.out.print (resumen.size());
        }
        catch (Exception e){
        }
    }

    public static void main(String[] args) {
        new Cliente();
    }
Cuando ejecuto el Servidor realiza los pasos correctamente:
1.- Conexión a la BD.
2.- Imprime por pantalla Iniciando Servidor... 192.168.X.X
3.- Imprime por pantalla Servidor iniciado
La salida que obtengo en el cliente es la siguiente:
1.- Imprime por pantalla Estableciendo conexión... // ESTA LINEA DEMORA APROX. 20 SEGUNDOS
2.- Imprime por pantalla Obteniendo resumen de cuenta...
3.- Y luego de aprox. otros 20 segundos me da la siguiente excepción:
Código:
java.rmi.ConnectException: Connection refused to host: 192.168.X.X; nested excep
tion is:
        java.net.ConnectException: Connection timed out: 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 chuidiang.ejemplos.rmi.suma.ObjetoRemoto_Stub.suma(ObjetoRemoto_Stub.java:35)
        at chuidiang.ejemplos.rmi.suma.Cliente.<init>(Cliente.java:32)
        at chuidiang.ejemplos.rmi.suma.Cliente.main(Cliente.java:44)
Caused by: java.net.ConnectException: Connection timed out: 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)
        ... 7 more
Por lo poco que puedo entender, logra encontrar el objeto pero no logra encontrar el método. Si no es así, por favor háganmelo saber.
Quedo a la espera de su ayuda. Desde ya, muchas gracias de antemano !!!
  #2 (permalink)  
Antiguo 06/10/2011, 16:25
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Sé que no es necesario poner el puerto, en mi caso 1099, pero sin el puerto me daba el mismo error.
  #3 (permalink)  
Antiguo 06/10/2011, 18:36
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 16 años, 4 meses
Puntos: 416
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Cita:
Estoy empezando a trabajar con RMI. Cuando pruebo todo desde dentro de la misma LAN, funciona sin problemas, pero cuando lo ejecuto en 2 conexiones diferentes, ahí se me produce el error
¿Cuando dices 2 conexiones diferentes te refieres a dos LAN que no estan conectadas entre ellas?
¿Puedes hacer ping a la dirección del servidor desde la otra red?
  #4 (permalink)  
Antiguo 07/10/2011, 09:35
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Hola Ronruby. Muchas gracias por responder.

Correcto, son 2 LAN diferentes no conectadas entre ellas.
Si, puedo hacer ping al servidor.
  #5 (permalink)  
Antiguo 07/10/2011, 13:02
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Pregunta: ¿tendrá algo que ver el archivo de políticas rmi.policy que vi en muchos lados?
  #6 (permalink)  
Antiguo 15/10/2011, 06:33
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Alguna idea?
  #7 (permalink)  
Antiguo 17/10/2011, 15:19
Avatar de DeeR  
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 20 años, 11 meses
Puntos: 17
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Creo que tal vez es un problema del server, ya que está escuchando en una ip local (y no en todas las intefaces), haz una prueba en el cliente tratanto de realizar un telnet a la ip y puerto.

Prueba seteando la ip pública del servidor o 0 (todas las interfaces)

Código JAVA:
Ver original
  1. Naming.rebind ("//" + "0" + ":1099/ObjetoRemoto", objetoRemoto);

Saludos
  #8 (permalink)  
Antiguo 18/10/2011, 10:37
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Hola Deer. Gracias por responder. Probé cambiando la instrucción Naming.rebind como dijiste, pero nada cambió.
Por otro lado, cuando le hice un telnet ip:puerto en el cliente, me dio lo siguiente:
Conectándose a X.X.X.X:1099...No se puede abrir la conexión al host, en puerto 23: Error en la conexión
¿Qué significa esto?
  #9 (permalink)  
Antiguo 18/10/2011, 10:44
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Rectifico: probé nuevamente hacerle un telnet sin los dos puntos (:) entre la ip y el puerto y me limpió la consola y dejó el cursor titilando en la primera posición de la pantalla, como esperando comandos míos. Luego de presionar unas teclas algunas veces, vuelve al prompt.
Aparentemente se puede conectar, ya que cuando pruebo con otro puerto me muestra el error dicho anteriormente.
  #10 (permalink)  
Antiguo 18/10/2011, 10:56
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Otra prueba:
puse solo telnet y me mostró el prompt Microsoft Telnet>.
Luego puse o "X.X.X.X" "1099" y me volvió a tirar el mismo error.
  #11 (permalink)  
Antiguo 18/10/2011, 13:31
Avatar de DeeR  
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 20 años, 11 meses
Puntos: 17
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Si toma la promt entonces hay conexión, el asunto ya va por otro lado.
¿Cuál es tu pólitica de permisos rmi.policy?


Prueba algo más permisivo, tipo
Código:
grant {

permission java.security.AllPermission;

};
  #12 (permalink)  
Antiguo 18/10/2011, 13:42
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Gracias de nuevo DeeR. El archivo .policy dice lo siguiente:
Código JAVA:
Ver original
  1. grant {
  2.     permission java.net.SocketPermission "*:1024-65535", "connect,accept";
  3.     permission java.net.SocketPermission "*:80", "connect";
  4. };
¿Es lo mismo? Digo... ¿Surte el mismo efecto? De todos modos probaré tu consejo.
  #13 (permalink)  
Antiguo 18/10/2011, 13:49
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Estoy intentando con otro ejemplo similar de RMI y me da la siguiente excepción:
Código JAVA:
Ver original
  1. java.net.NoRouteToHostException: No route to host: connect
  2. java.rmi.ConnectIOException: Exception creating connection to: X.X.X.X; n
  3. ested exception is:
  4.         java.net.NoRouteToHostException: No route to host: connect
  5.         at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
  6.         at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
  7.         at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
  8.         at sun.rmi.server.UnicastRef.invoke(Unknown Source)
Este error me lo da cuando quiere hacer el Naming.lookup
  #14 (permalink)  
Antiguo 26/10/2011, 12:50
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Alguna idea?
  #15 (permalink)  
Antiguo 20/01/2012, 08:21
 
Fecha de Ingreso: noviembre-2010
Ubicación: Tandil
Mensajes: 79
Antigüedad: 14 años
Puntos: 3
Respuesta: No puedo ejecutar un método de un objeto remoto en RMI

Bueno, al final pude solucionarlo, pero no utilizando RMI. Desistí. Directamente trabajo con Sockets (creo que es un nivel más bajo)... y funciona a la perfección. Cualquiera que quiera saber cómo lo resolví, no dude en enviarme un MP (obviamente, previa búsqueda en Google acerca de Sockets, ya que hay bastante info sobre esto... GIYF). Muchas gracias a todos.

Etiquetas: excepcion, metodo, objeto, remoto, rmi, timedout
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:42.