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:
- naviga verso bin del mio progetto utilizzando Terminal
- corro rmiregistry da lì
- Eseguo il mio CommunicationServer dalla nuova finestra di Terminale (e stampa i messaggi in modo che sembri funzionare)
- 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?
@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