Error en cliente rmi

Jose
16 de Febrero del 2004
Buenas , estoy realizando unas practicas de rmi ; y al ejecutar el cliente me da el siguiente error :
java.lang.ClassCastException
Stack trace is disabled. Set JAVA_COMPCMD=STA<CKTRACE> to enable ; sabeis que significa o como se puede solucionar.
Lo que no entiendo es que segun en la maquina que se ejecute salta la excepcion o no , en NT no , pero si en XP.

Gracias por todo.

xxx
16 de Febrero del 2004
Pues un cast es una conversion explicita de tipos, por lo q la ClassCastException aparecerá cuando intentes hacer una conversión a un tipo incompatible.
En un cliente RMI seguramente tendras algo como:
InterfazRmi c = (InterfazRmi) Naming.lookup("rmi://localhost/NombreServicio");
y será én ese cast donde te de el error, asegurate que en el servidor hiciste el Naming.rebind pasandole un objeto del tipo InterfazRmi, no del tipo q implementa dicha interfaz... No se si me explico...
vamos q en el servidor debes hacer algo como:
InterfazRmi x = new ClaseQueImplementaLaInterfaz();
Naming.rebind(NombreServicio, x);
para q el Naming.lookup funciona...
Todo esto se basa en especulacions porque como no pones el codigo donde te da el error... pos eso

Jose
16 de Febrero del 2004
Bueno he estado mirando y el error en efecto es el cast , pero la gente con la que lo he comentado piensa que el codigo esta bien ; el codigo es el siguiente :

SERVIDOR :

package ServidorFib;
import java.rmi.*;
import java.math.BigInteger;

public interface Fibonacci extends Remote {

public BigInteger getFibonacci(int n) throws RemoteException;
public BigInteger getFibonacci(BigInteger n) throws RemoteException;
}

package ServidorFib;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.math.BigInteger;

public class FibonacciImpl implements Fibonacci {
public FibonacciImpl() throws RemoteException {
UnicastRemoteObject.exportObject(this);
}

public BigInteger getFibonacci(int n) throws RemoteException {
return this.getFibonacci(new BigInteger(Long.toString(n)));
}

public BigInteger getFibonacci(BigInteger n) throws RemoteException {
System.out.println("Calculating the " + n + "th Fibonacci number");
BigInteger zero = new BigInteger("0");
BigInteger one = new BigInteger("1");

if (n.equals(zero)) return zero;
if (n.equals(one)) return one;

BigInteger i = one;
BigInteger a = zero;
BigInteger b = one;

while (i.compareTo(n) == -1) {
BigInteger temp = b;
b = b.add(a);
a = temp;
i = i.add(one);
}
return b;
}
}


package ServidorFib;
import java.net.MalformedURLException;
import java.rmi.*;

public class FibonacciServer {

public static void main(String[] args) {
try {
FibonacciImpl f = new FibonacciImpl();
Naming.rebind("fibonacci", f);
System.out.println("Fibonacci Server ready.");
} catch (RemoteException re) {
System.out.println("Exception in FibonacciServer: " + re);
} catch (MalformedURLException e) {
System.out.println("MalformedURLException " + e);
}
}
}




CLIENTE :
package ServidorFib;
import java.rmi.*;
import java.math.BigInteger;

public interface Fibonacci extends Remote {

public BigInteger getFibonacci(int n) throws RemoteException;
public BigInteger getFibonacci(BigInteger n) throws RemoteException;
}


package ClienteFib;
import java.rmi.*;
import java.net.*;
import java.math.BigInteger;

public class FibonacciClient {

public static void main(String args[]) {
if (args.length == 0 || !args[0].startsWith("rmi:")) {
System.err.println("Usage: java Fibonacci client rmi://host.domain:port/fibonacci number");
return;
}
try {
Object o = Naming.lookup(args[0]);
Fibonacci calculator = (Fibonacci) o;
for (int i = 1; i < args.length; i++) {
try {
BigInteger index = new BigInteger(args[i]);
BigInteger f = calculator.getFibonacci(index);
System.out.println("The " + args[i] +
"th Fibonacci number is " + f);
}
catch (NumberFormatException e) {
System.err.println(args[i] + "is not an integer.");
}
}
} catch (MalformedURLException e) {
System.err.println(args[0] + " is not a valid RMI URL");
} catch (RemoteException e) {
System.err.println("Remote object threw exception " + e);
} catch (NotBoundException e) {
System.err.println(
"Could not find the requested remote object on the server");
}
}
}


En el paquete del cliente tambien he incluido el FibonacciImpl_stub.class , pero el error sigue siendo igual.