Създавам първото си много просто RMI клиент-сървър приложение.
Ето кода:
Интерфейс "ICCommunication"
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;
}
Реализация на интерфейс "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";
}
}
Ето моя основен клас на сървъра "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'.");
}
}
А това е моят клиент "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);
}
}
Сега, когато се опитвам да го стартирам:
- Навигирам до директорията bin на моя проект с помощта на терминал
- Пускам rmiregistry от там
- Пускам своя CommunicationServer от нов прозорец на терминала (и той отпечатва съобщенията, така че изглежда, че работи)
- Отварям трети прозорец на терминала и когато се опитам да стартирам своя CommunicationClient, той хвърля изключение.
java itu.exercies.RMI.client.CommunicationClientException в нишката "main" java.lang.ClassCastException: $Proxy0 не може да бъде прехвърлен към itu.exercies.RMI.server.CommunicationImpl в itu.exercies.RMI.client.CommunicationClient.main(CommunicationClient .java:14)
Досега се опитвах да го поправя, като създадох мъниче на обект „CommunicationImpl“ с помощта на rmic, но сега вместо „$Proxy0“ грешката се отнася до „CommunicationImpl_Stub“:
Изключение в нишката "main" java.lang.ClassCastException: itu.exercies.RMI.server.CommunicationImpl_Stub не може да бъде прехвърлено към itu.exercies.RMI.server.CommunicationImpl в itu.exercies.RMI.client.CommunicationClient.main(CommunicationClient.java :14)
На този етап нямам идея да търся грешки. Може ли някой да ми даде предложения?