Java RMI

BUENAS TARDES, SOY NUEVA EN ESTA PAGINA.
Y TAMBIEN NUEVA EN JAVA RMI, SE CUAL ES SU FUNCION Y COMO ES LA COMUNICACION CLIENTE-SERVIDOR, EN EJEMPLOS SIMPLES, PERO TENGO UNA DUDA, QUIERO TENER UN CLIENTE Y VARIOS SERVIDORES.
Y LA DUDA EN SI ES: QUIERO ENVIAR OBJETOS (VARIABLES TIPO int)TRANSIENT DEL CLIENTE AL SERVIDOR Y QUE EL SERVIDOR LOS IMPRIMA. NO SE SI SE PUEDA HACER ESTO, EL CLIENTE SOLO DEBE DE ENVIAR DATOS AL SERVER, Y EL SERVER DEBE DE TRABAJAR CON ESTOS, Y GENERAR UNA SALIDA.
GRACIAS POR SU AYUDA

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de adrianaaae

RMI

Yo tengo un sistema implementando RMI; para la misma situación(impresión remota)

1.-El Cliente es quien se conecta al Servidor(Entonces el servidor siempre tiene un puerto para escuchar peticiones) que es el que tiene los métodos que se van a invocar; en tu caso el método para Imprimir.

2.-El Cliente como tal es quien abre un puerto para tratar de comunicarse al servidor; por lo tanto puedes comunicarte a cualquier servidor, basta con cambiar en tu configuración la IP del servidor a donde te vas a conectar.

En resumen SI se puede tener varios servidores y el cliente puede decidir en base a la configuración(si usas Spring) o al código hacia donde se conectará por la IP.

Saludos.

RMI

GRACIAS.

BUENO TAMBIEN CREO NO ESPECIFIQUE BIEN CUAL ES LA DIFICULTAD AQUI.
EL PROBLEMA QUE TENGO ES MAS BIEN REFERENTE EN SI ESTOY ENVIANDO BIEN LOS OBJETOS TIPO "TRANSIENT" (VARIABLES INT) DESDE EL CLIENTE AL SERVIDOR, YA QUE COMO MENCIONE ANTERIORMENTE, LO QUE QUIERO ES ENVIAR ESTOS DATOS AL SERVER PARA QUE ESTE TRABAJE CON ESTOS Y LOS IMPRIMA. TENGO EL METODO SIGUIENTE QUE ESTA EN EL CLIENTE

public class Imprimiendo extends UnicastRemoteObject implements InterfaceImprimir, Serializable{

private transient int minions=0;
private transient int inicio=0;

public Imprimiendo(int a, int b) throws RemoteException{
this.minions=a;
this.inicio=b;

}

@Override
public int getMinions() {
return minions;
}

@Override
public int getInicio() {
return inicio;
}

Y DE ESTE METODO ES DONDE LO LLAMO EN EL CLIENTE PARA DARLE EL VALOR A ESAS VARIBLES.
NO SE BIEN COMO SE HAGA ESTO
Y ESTE EL CLIENTE,
public class Cliente implements Serializable{

public class Cliente implements Serializable{

public static void main(String args[]) {

if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
String host = (args.length < 1) ? null : args[0];
try
{
String name = "name";
Registry registry = LocateRegistry.getRegistry(host);
//se liga el cliente con el servidor a traves de lookup(name)
InterfaceRemota objetoRemoto = (InterfaceRemota) registry.lookup(name);

objetoRemoto.regresaMinion(new Imprimiendo(6,11));
}
catch (Exception e)
{
System.err.println("ComputePi exception:");
e.printStackTrace();
}
}

Imagen de adrianaaae

RMI

    No veo los siguientes datos(esto si los tienes) o el stacktrace del error:
  • No veo la interface InterfaceImprimir
  • No veo el método Main del Server
  • Para el cliente; la variable name no representa el servicio(rmi)

Si pudieras poner todo tu codigo sería mas facil apoyarte.
Y de preferencia ponerlo entre las etiquetas(<code>) correspondientes de código.

Imagen de ezamudio

transient

Cuando marcas un campo como transient, ese campo no se serializa. Como tus campos son tipo int, lo que pasa es que se quedan en ceros del lado del server, porque esos campos no se enviaron en el mensaje de RMI.

Ahora, creo que estás hecha bolas con algunas cosas: No veo por qué el constructor de Imprimiendo arroja RemoteException, o por qué implementa UnicastRemoteObject. Con que sea Serializable es suficiente para poder enviarlo por RMI.

Y cuando usas RMI, es muy recomendable que le pongas versión a las clases que vas a transmitir.