ClassCastException: $Proxy0 не може да бъде прехвърлена грешка при създаване на просто RMI приложение

Създавам първото си много просто 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);


    }

}

Сега, когато се опитвам да го стартирам:

  1. Навигирам до директорията bin на моя проект с помощта на терминал
  2. Пускам rmiregistry от там
  3. Пускам своя CommunicationServer от нов прозорец на терминала (и той отпечатва съобщенията, така че изглежда, че работи)
  4. Отварям трети прозорец на терминала и когато се опитам да стартирам своя 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)

На този етап нямам идея да търся грешки. Може ли някой да ми даде предложения?


person Booyaches    schedule 08.03.2012    source източник


Отговори (1)


Сменете

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

с

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

CommunicationImpl е сървърната реализация на ICommunication. Клиентът нито знае, нито го интересува изпълнението, а само интерфейса.

person skaffman    schedule 08.03.2012
comment
@Booyaches Точно така. Обектът CommunicationImpl е отдалечен. Нямате го локално. Имате нещо друго, което прилага същия отдалечен интерфейс. За това е дистанционният интерфейс. - person user207421; 09.03.2012
comment
Направих го.. но все още дава същото изключение, ако клиент и сървър са две различни приложения (въпреки че интерфейсите са написани с абсолютно еднакви формулировки..) - person Giorgi Tsiklauri; 07.09.2019