私は最初の非常に単純なRMIクライアントサーバーアプリケーションを作成しています。
コードは次のとおりです。
インターフェース「ICommunication」
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);
}
}
今私がそれを実行しようとすると:
スレッド "main"のJavaitu.exercies.RMI.client.CommunicationClientException Java.lang.ClassCastException:$ Proxy0をitu.exercies.RMI.client.CommunicationClient.main(CommunicationClient)のitu.exercies.RMI.server.CommunicationImplにキャストできません。 .Java:14)
これまで、rmicを使用して「CommunicationImpl」オブジェクトのスタブを作成することで修正しようとしましたが、「$ Proxy0」の代わりに、エラーは「CommunicationImpl_Stub」を参照しています。
スレッド「main」の例外Java.lang.ClassCastException:itu.exercies.RMI.server.CommunicationImpl_Stubをitu.exercies.RMI.client.CommunicationClient.main(CommunicationClient.Java)のitu.exercies.RMI.server.CommunicationImplにキャストできません。 :14)
この時点では、エラーを探すことは考えられませんでした。誰か提案をいただけますか?
交換
CommunicationImpl comm = (CommunicationImpl) Naming.lookup(url);
と
ICommunication comm = (ICommunication) Naming.lookup(url);
CommunicationImpl
は、ICommunication
のサーバー実装です。クライアントは実装を知らず、気にしません。インターフェースだけです。