Estoy creando mi primera y muy sencilla aplicación cliente-servidor RMI.
Aquí está el código:
Interface "ICommunication" aplicación
package itu.exercies.RMI.server;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ICommunication extends Remote
{
public String doCommunicate(String name) throws RemoteException;
}
Interface "CommunicationImpl":
package itu.exercies.RMI.server;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class CommunicationImpl extends UnicastRemoteObject implements ICommunication {
/**
*
*/
private static final long serialVersionUID = 1L;
public CommunicationImpl() throws RemoteException {
super();
}
@Override
public String doCommunicate(String name) throws RemoteException {
return "Hello this is server , whats up " +name+ " ?!\n";
}
}
Aquí está mi clase principal del servidor "CommunicationServer":
package itu.exercies.RMI.server;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
public class CommunicationServer {
/**
* @param args
* @throws RemoteException
* @throws MalformedURLException
*/
public static void main(String[] args) throws RemoteException, MalformedURLException {
CommunicationImpl imp = new CommunicationImpl();
Naming.rebind("CommunicationImpl", imp);
System.out.println("Server started...");
System.out.println("Object successfully registered. It is bound to the name 'CommunicationImpl'.");
}
}
Y esta es mi cliente "CommunicationClient":
package itu.exercies.RMI.client;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import itu.exercies.RMI.server.CommunicationImpl;
public class CommunicationClient {
public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException {
String url = new String("rmi://localhost/CommunicationImpl");
CommunicationImpl comm = (CommunicationImpl)Naming.lookup(url);
String reply = comm.doCommunicate("Wiktor");
System.out.println(reply);
}
}
Ahora cuando intento ejecutarlo:
- navego en el directorio bin de mi proyecto utilizando Terminal
- corro rmiregistry desde allí
- Ejecuto CommunicationServer desde la nueva ventana Terminal (e imprime los mensajes para que parezca funcionar)
- Abro la ventana de la tercera terminal y cuando intento para ejecutar mi CommunicationClient arroja una excepción.
itu.exercies.RMI.client.CommunicationClientException java en hilo de java.lang.ClassCastException "principal": $ Proxy0 no puede ser echado a itu.exercies.RMI.server.CommunicationImpl en itu.exercies. RMI.client.CommunicationClient.main (CommunicationClient.java:14)
hasta ahora he tratado de solucionarlo mediante la creación de un talón del objeto 'CommunicationImpl' usando rmic pero ahora en lugar de '$ Proxy0' se refiere al error a 'CommunicationImpl_Stub':
Excepción en hilo java.lang.ClassCastException "principal": itu.exercies.RMI.server.CommunicationImpl_Stub no se puede convertir a itu.exercies.RMI.server.CommunicationImpl en itu.exercies.RMI.client.CommunicationClient.main (CommunicationClient.java:14)
en este punto no tengo ni idea fuera para buscar errores. ¿Alguien puede darme alguna sugerencia?
@Booyaches Exactamente. El objeto CommunicationImpl es remoto. No lo tienes localmente Tienes algo más que implementa la misma interfaz remota. Para eso es la interfaz remota. – EJP