web-dev-qa-db-ja.com

単純なRMIアプリケーションの作成中に「ClassCastException:$ Proxy0をキャストできません」エラーが発生しました

私は最初の非常に単純な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);


    }

}

今私がそれを実行しようとすると:

  1. ターミナルを使用してプロジェクトのbinディレクトリに移動します
  2. そこからrmiregistryを実行します
  3. 新しいターミナルウィンドウからCommunicationServerを実行します(メッセージが出力されるため、機能しているように見えます)
  4. 3番目のターミナルウィンドウを開き、CommunicationClientを実行しようとすると、例外がスローされます。

スレッド "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)

この時点では、エラーを探すことは考えられませんでした。誰か提案をいただけますか?

12
Booyaches

交換

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

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

CommunicationImplは、ICommunicationのサーバー実装です。クライアントは実装を知らず、気にしません。インターフェースだけです。

23
skaffman