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

[SOLUCIONADO] Problema con RMI al funcionar el maquinas distintas

Estas en el tema de Problema con RMI al funcionar el maquinas distintas en el foro de Java en Foros del Web. Hola a todos de nuevo!! Luego de un tiempo de avanzar en el programa de ciberControl que realizo con RMI, me surgió el siguiente problema, ...
  #1 (permalink)  
Antiguo 07/04/2018, 02:49
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años, 7 meses
Puntos: 3
Pregunta Problema con RMI al funcionar el maquinas distintas

Hola a todos de nuevo!!

Luego de un tiempo de avanzar en el programa de ciberControl que realizo con RMI, me surgió el siguiente problema, al correr mi servidor en la maquina designada para ello, y correr un cliente desde un laptop, me he encontrado con el problema de que hace todas las funciones, pero al tratar de desconectar el cliente del servidor, este no lo encuentra, he especificado los puertos de la siguiente manera...

Para el servidor el código es este:

Código Java:
Ver original
  1. public void iniciar() throws RemoteException, AlreadyBoundException{
  2.         Remote stub = UnicastRemoteObject.exportObject(new IConexion() {
  3.             @Override
  4.             public boolean conectarse(String ip) throws RemoteException {
  5.                 System.out.println("DEBUG: Llegó un nuevo cliente: Ip:"+ip);
  6.                 boolean estado = clientes.add(ip);
  7.                 CServidor.actualizarClientes(clientes);
  8.                 CServidor.Pcs(clientes);
  9.                 return estado;
  10.             }
  11.            
  12.            
  13.             @Override
  14.             public boolean desconectarse(String accion,String ip) throws
  15.               RemoteException {
  16.                 System.out.println("DEBUG: Salio el cliente de la Ip:"+ip);
  17.                 boolean estado =false;
  18.                 clientes.remove(ip);
  19.                 System.out.println(estado);
  20.                 CServidor.actualizarClientes(clientes);
  21.                 CServidor.Pcs(clientes);              
  22.                 CServidor.desconectarCliente(ip);//Aquí desconecto el cliente por medio de la ip....
  23.                if(accion.equals("RECONECTAR")) {//Aquí lo conecto de nuevo si es que se desea hacerlo..
  24.                    System.out.println("Funciona");
  25.                     CServidor.reconectaCliente(ip);
  26.                     clientes.add(ip);
  27.                     CServidor.actualizarClientes(clientes);
  28.                 }
  29.                 return estado;
  30.             }
  31.            
  32.         },puerto); ///El puerto le ingreso el '90'
  33.         try {
  34.         Registry registry = LocateRegistry.createRegistry(puerto);
  35.        
  36.         registry.bind("Servidor", stub);
  37.            
  38.             System.out.println("DEBUG: Estoy corriendo en:"+InetAddress.getLocalHost().getHostAddress()+":"+this.puerto);
  39.         } catch (UnknownHostException ex) {
  40.             Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
  41.         }
  42.     }

Este es el código de cliente:
Código Java:
Ver original
  1. public void iniciar() throws RemoteException, AlreadyBoundException{
  2.         Remote stub = UnicastRemoteObject.exportObject(new IClienteRemoto() {
  3.             @Override
  4.             public boolean mensaje(String accion) throws RemoteException {
  5.                 boolean estado = false;
  6.               //  System.out.println("DEBUG: "+accion);
  7.           //A partir de aquí son las funciones que ejecuta en la PC cliente
  8.                 if(accion.equals("BLOQUEAR")) {
  9.                     CCliente.bloquearPC();
  10.                     estado = true;
  11.                 }
  12.                 if(accion.equals("DESBLOQUEAR")){
  13.                     CCliente.desbloquearPC();
  14.                     estado = true;
  15.                 }
  16.                 if(accion.equals("APAGAR")){
  17.                     CCliente.apagarPC();
  18.                     estado = true;
  19.                 }
  20.                 if(accion.equals("REINICIAR")){
  21.                     CCliente.reiniciarPC();
  22.                     estado = true;
  23.                 }
  24.                 if(accion.equals("CANCELAR")){
  25.                     CCliente.cancelarPC();
  26.                     estado = true;
  27.                 }
  28.                 return estado;
  29.             }
  30.         },1090);//Puerto que uso para el cliente
  31.         Registry registry = LocateRegistry.createRegistry(1090);
  32.         registry.bind(this.ip, stub);
  33.     }

La cosa es que si ejecuto mi servidor, y mi cliente en la misma PC, todo funciona bien, es decir Bloquea, Desbloquea,Reinicia,Apaga,Cancela y funciona lo de Desconectar el cliente y Re-conectar el cliente

Pero si ejecuto el servidor en una PC y el cliente en otra, si me deja Bloquear, Desbloquear,Reiniciar,Apagar etc.. pero al tratar de desconectarse del servidor simplemente no procede...

Investigue que se debe a que debe darse la dirección IP del servidor es decir si es '192.168.1.25' y su puerto '90' el cliente debe hacer la petición a esa dirección.

Es por ello que recurro a usted, espero puedan ayudarme ya que he intentado todo lo que se me ha ocurrido pero simplemente no he podido encontrar solución alguna..

Dejo el siguiente código complementario de como Desconecto el cliente..:
Código Java:
Ver original
  1. public void desconectar(String accion,String ip_des, int port) throws RemoteException, NotBoundException{
  2.      try {
  3.        //String ip_me = InetAddress.getLocalHost().getHostAddress();
  4.          
  5.         //Registry registro = LocateRegistry.getRegistry(ip_me, port); Tambien he intentado pasar mi ip local, pero es el mismo resultado no funciona en 2 maquinas solo en un solo
  6.        
  7.         Registry registro = LocateRegistry.getRegistry(ip_des, port);
  8.         IConexion servidorRemoto = (IConexion) registro.lookup("Servidor");
  9.  
  10.             servidorRemoto.desconectarse(accion,ip_des);
  11.             CCliente.actualizarNombrePC("Desconectado");
  12.         } catch (UnknownHostException ex) {
  13.             Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
  14.         }
  15.     }


Gracias por leerme!!
__________________
Desbloquea esos limites...

Última edición por sgrajaleshdz; 07/04/2018 a las 02:55 Razón: Codigo mal escrito
  #2 (permalink)  
Antiguo 07/04/2018, 10:58
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Problema con RMI al funcionar el maquinas distintas

¿qué clase es CServidor?

¿Qué hace CServidor.desconectarCliente(ip)?
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 07/04/2018, 16:31
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años, 7 meses
Puntos: 3
Respuesta: Problema con RMI al funcionar el maquinas distintas

Cita:
Iniciado por Fuzzylog Ver Mensaje
¿qué clase es CServidor?

¿Qué hace CServidor.desconectarCliente(ip)?
Hola la clase servidor contiene los metodos publicos de llamada a eventos internos dentro de un archivo de Formulario por ejemplo CServidor.desconectarCliente(ip) hace referencia en a:

Código Java:
Ver original
  1. private static IServidor ventana;
  2.  
  3. ventana = new IServidor(); //Llama al Jframe correspondiente de la interfaz servidor
  4.  
  5.  public static void desconectarCliente(String ip){
  6.         ventana.desconecta(ip);
  7.     }
  8.  
  9.  public static void reconectaCliente(String ip){
  10.         ventana.reconecta(ip);
  11.     }

Que a su vez llama el metodo ventana.desconecta(ip); donde ventana es el Formulario con Nombre Iservidor (Jframe) el cual contiene el a desconecta(ip); de la siguiente forma:

Código Java:
Ver original
  1. //Función para desconectar cliente
  2. public void desconecta(String ip){
  3.     if(ip.equals(datos.get(0))){
  4.         boton1.setEnabled(false);//Boton de la PC1
  5.         etiquetaTiempo1.setEnabled(false);//Etiqueta de tiempo
  6.     }
  7.     if(ip.equals(datos.get(1))){//datos get es de un Map, donde guardo las direcciones ip
  8.         boton2.setEnabled(false);//Boton de la PC2
  9.         etiquetaTiempo2.setEnabled(false); // Etiqueta de tiempo
  10.     }
  11. }
  12.  
  13. //Función para re-conectar un cliente
  14. public void reconecta(String ip){
  15.     if(ip.equals(datos.get(0))){
  16.         boton1.setEnabled(true);
  17.         etiquetaTiempo1.setEnabled(true);
  18.     }
  19.     if(ip.equals(datos.get(1))){
  20.         boton2.setEnabled(true);
  21.         etiquetaTiempo2.setEnabled(true);
  22.     }
  23. }

Como comento todo funciona en local en una misma PC, pero al ser ejecutadas en ordenadores distintos una cliente y otra servidor las funciones Desconectar y Re-conectar dejan de funcionar.
__________________
Desbloquea esos limites...

Última edición por sgrajaleshdz; 07/04/2018 a las 16:33 Razón: Falto codigo
  #4 (permalink)  
Antiguo 07/04/2018, 18:12
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Problema con RMI al funcionar el maquinas distintas

¿Cuando conectas desde una ip externa estás guardando la nueva ip en el Map datos?

¿además por qué sólo haces datos.get(0) y datos.get(1)?
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 07/04/2018, 18:37
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años, 7 meses
Puntos: 3
Respuesta: Problema con RMI al funcionar el maquinas distintas

Cita:
Iniciado por Fuzzylog Ver Mensaje
¿Cuando conectas desde una ip externa estás guardando la nueva ip en el Map datos?

¿además por qué sólo haces datos.get(0) y datos.get(1)?

Si estoy guardando la nueva ip en Map datos...

Y solo por ejemplificar lo que pasa con las primeras dos maquinas por eso solo pongo datos.get(0); y datos.get(1);
__________________
Desbloquea esos limites...
  #6 (permalink)  
Antiguo 08/04/2018, 13:43
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Problema con RMI al funcionar el maquinas distintas

Pues analiza que ocurre cuando la IP es externa.

1º se debería guardar en el map datos.
2º al comparar que sale. ¿Hace lo que debe hacer?
3º igual hay que mandar alguna clase de respuesta a la máquina externa para que se entere de que se ha desconectado y el cliente actualice la interfaz.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #7 (permalink)  
Antiguo 08/04/2018, 15:38
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 8 años, 7 meses
Puntos: 3
Respuesta: Problema con RMI al funcionar el maquinas distintas

Cita:
Iniciado por Fuzzylog Ver Mensaje
Pues analiza que ocurre cuando la IP es externa.

1º se debería guardar en el map datos.
2º al comparar que sale. ¿Hace lo que debe hacer?
3º igual hay que mandar alguna clase de respuesta a la máquina externa para que se entere de que se ha desconectado y el cliente actualice la interfaz.
Pues todo ello, ya lo hice y en teoría debió haber funcionado de esa forma pues indicaba al servidor que deseaba desconectar mi maquina cliente con la IP y el Puerto tal, sin embargo no lo hacia, así que decidí darle otro enfoque, pues si el servidor hace que el cliente obedezca, el cliente podría hacer lo mismo, por lo cual implemente un misma función pero en sentido inverso y funciono dejo el código por si a alguien le sirve;

Como envía instrucciones el Servidor al Cliente:
Código Java:
Ver original
  1. //Toma la ip del cliente al cual se le ordena el siguiente comando
  2.  public void bloquear(String ip) throws RemoteException, NotBoundException{
  3.         Registry registry = LocateRegistry.getRegistry(ip, 1090);//Busca la ip en su tabla de registros e indica el puerto
  4.         IClienteRemoto clienteRemoto = (IClienteRemoto) registry.lookup(ip);
  5.         clienteRemoto.mensaje("BLOQUEAR");//La accion que el cliente ejecutara
  6.     }

Como revise el Cliente la instrucción del Servidor:
Código Java:
Ver original
  1. public boolean mensaje(String accion) throws RemoteException {
  2.                 boolean estado = false;
  3.               //  System.out.println("DEBUG: "+accion);
  4.                 if(accion.equals("BLOQUEAR")) {
  5.                     CCliente.bloquearPC();
  6.                     estado = true;
  7.                 }
  8.                 if(accion.equals("DESBLOQUEAR")){
  9.                     CCliente.desbloquearPC();
  10.                     estado = true;
  11.                 }
  12.                 if(accion.equals("APAGAR")){
  13.                     CCliente.apagarPC();
  14.                     estado = true;
  15.                 }
  16.                 if(accion.equals("REINICIAR")){
  17.                     CCliente.reiniciarPC();
  18.                     estado = true;
  19.                 }
  20.                 if(accion.equals("CANCELAR")){
  21.                     CCliente.cancelarPC();
  22.                     estado = true;
  23.                 }
  24.                 return estado;
  25.             }

Por lo tanto implemente solo modifique la clase desconectar del Servidor para que reciba la instrucción del cliente:
Código Java:
Ver original
  1. public void desconectar(String accion,String ip_des, int port) throws RemoteException, NotBoundException{
  2.      try {
  3.         String ip_me = InetAddress.getLocalHost().getHostAddress();
  4.          
  5.          
  6.        
  7.         Registry registro = LocateRegistry.getRegistry(ip_des, port);//Indico la ip y el puerto por el cual se dirigirá
  8.         IConexion servidorRemoto = (IConexion) registro.lookup("Servidor");
  9.  
  10.             servidorRemoto.desconectarse(accion,ip_me);
  11.             CCliente.actualizarEstado("Desconectado");//Le digo a cliente que actualize su interfaz a Desconectado
  12.         } catch (UnknownHostException ex) {
  13.             Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
  14.         }
  15.     }

Bueno eso es todo espero sea de ayuda para alguien mas

Y gracias por la atención prestada al tema
__________________
Desbloquea esos limites...

Etiquetas: ciber, cliente, control, rmi, servidor
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 10:49.