【问题标题】:"ClassCastException: $Proxy0 cannot be cast" error while creating simple RMI application创建简单 RMI 应用程序时出现“ClassCastException: $Proxy0 cannot be cast”错误
【发布时间】:2012-03-08 15:34:49
【问题描述】:

我正在创建我的第一个非常简单的 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. 我打开第三个终端窗口,当我尝试运行我的 CommunicationClient 时,它会引发异常。

线程“main”中的java itu.exercies.RMI.client.CommunicationClientException java.lang.ClassCastException:$Proxy0 无法转换为 itu.exercies.RMI.server.CommunicationImpl 在 itu.exercies.RMI.client.CommunicationClient.main(CommunicationClient.java:14)

到目前为止,我已经尝试通过使用 rmic 创建一个“CommunicationImpl”对象的存根来修复它,但现在错误指的是“CommunicationImpl_Stub”而不是“$Proxy0”:

线程“main”java.lang.ClassCastException 中的异常:itu.exercies.RMI.server.CommunicationImpl_Stub 无法转换为 itu.exercies.RMI.server.CommunicationImpl 在 itu.exercies.RMI.client.CommunicationClient.main(CommunicationClient.java:14)

此时我不知道要查找错误。有人可以给我任何建议吗?

【问题讨论】:

    标签: java rmi


    【解决方案1】:

    替换

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

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

    CommunicationImplICommunication 的服务器实现。客户端既不知道也不关心实现,只关心接口。

    【讨论】:

    • @Booyaches 正是如此。 CommunicationImpl 对象是远程的。你本地没有。您还有其他实现相同远程接口的东西。这就是远程接口的用途。
    • 我做到了..但如果客户端和服务器是两个不同的应用程序,它仍然会给出相同的异常(尽管接口是用完全相同的措辞编写的..)
    猜你喜欢
    • 2018-09-29
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多