Error en cliente rmi
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.
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.
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
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
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.
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.
