2012-03-08 1 views
9

Sto creando la mia prima, molto semplice applicazione client-server RMI.

Ecco il codice:

Interface "ICommunication" l'attuazione

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"; 
    } 

} 

Ecco la mia classe principale del server "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'."); 

    } 

} 

E questo è il mio 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); 


    } 

} 

Ora in cui provo a farlo funzionare:

  1. naviga verso bin del mio progetto utilizzando Terminal
  2. corro rmiregistry da lì
  3. Eseguo il mio CommunicationServer dalla nuova finestra di Terminale (e stampa i messaggi in modo che sembri funzionare)
  4. Apro la terza finestra del terminale e quando provo per eseguire il mio CommunicationClient genera un'eccezione.

java itu.exercies.RMI.client.CommunicationClientException in thread "main" java.lang.ClassCastException: $ Proxy0 non può essere lanciato a itu.exercies.RMI.server.CommunicationImpl a itu.exercies. RMI.client.CommunicationClient.main (CommunicationClient.java:14)

Finora ho cercato di risolvere il problema con la creazione di uno stub dell'oggetto 'CommunicationImpl' utilizzando rmic ma ora invece di '$ Proxy0' l'errore si riferisce a "CommunicationImpl_Stub":

Eccezione nel thread "main" java.lang.ClassCastException: itu.exercies.RMI.server.CommunicationImpl_Stub non può essere trasmesso a itu.exercies.RMI.server.CommunicationImpl in itu.exercies.RMI.client.CommunicationClient.main (CommunicationClient.java:14)

A questo punto non ho idea di cercare errori. Qualcuno può darmi qualche suggerimento?

risposta

18

Sostituire

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

con

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

CommunicationImpl è l'implementazione del server del ICommunication. Il cliente non sa né si preoccupa dell'implementazione, ma solo dell'interfaccia.

+2

@Booyaches Esattamente così. L'oggetto CommunicationImpl è remoto. Non ce l'hai localmente. Hai qualcos'altro che implementa la stessa interfaccia remota. Ecco a cosa serve l'interfaccia remota. – EJP