2012-03-08 13 views
9

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:

  1. navego en el directorio bin de mi proyecto utilizando Terminal
  2. corro rmiregistry desde allí
  3. Ejecuto CommunicationServer desde la nueva ventana Terminal (e imprime los mensajes para que parezca funcionar)
  4. 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?

Respuesta

18

Reemplazar

CommunicationImpl comm = (CommunicationImpl) Naming.lookup(url); 

con

ICommunication comm = (ICommunication) Naming.lookup(url); 

CommunicationImpl es la implementación del servidor de la ICommunication. El cliente no conoce ni se preocupa por la implementación, solo la interfaz.

+2

@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

Cuestiones relacionadas