客户端上的RMI在获取对RMI服务器的引用时生成异常

时间:2010-06-07 15:26:18

标签: java rmi

当我在运行RMI服务器后尝试运行RMI客户端时,我得到以下异常:

EncodeInterface exception: java.lang.ClassCastException: $Proxy30 cannot be cast to hw2.chat.backend.main.EncodeInterface
java.lang.ClassCastException: $Proxy30 cannot be cast to hw2.chat.backend.main.EncodeInterface
at hw2.chat.backend.main.EncodingRmiClient.initialiseRMIClient(EncodingRmiClient.java:26)

RMI客户端中的相关代码是:

EncodeInterface encodeInterface;
Registry registry = LocateRegistry.getRegistry(host, portNumber);
encodeInterface = (EncodeInterface)registry.lookup("RmiEncodingServer"); //line 26

在RMI服务器中:

    try
    {
        EncodeInterface encodeInterface = new EncoderImpl();
        Registry registry = LocateRegistry.getRegistry();
        registry.rebind("RmiEncodingServer", encodeInterface);
        System.out.println("RmiEncodingServer is running...");
    }

EncodeInterface是扩展Remote的接口,也存在于客户端。

主机是“127.0.0.1”,portNumber是1099(我假设它应该是默认值1099,因为我在运行RmiEncodingServer时没有指定它。)

如果我没有运行RMI服务器,我会得到相同的例外,为什么会发生这种情况?

感谢

2 个答案:

答案 0 :(得分:2)

ClassCastException通常意味着

  • EncoderImpl未实施EncodeInterface
  • 客户端和服务器端的.jar不同,导致要部署的类的两个版本被认为是不同的。

几点提示:

  1. 检查您是否实现了界面,例如

    EncoderImpl extends UnicastRemoteObject implements EncodeInterface

  2. 在java serialization的支持下为您的类添加版本ID,例如

    static final long serialVersionUID = 10275539472837495L;

  3. 清理,重建和重新部署,并重新启动所有内容以确保每个部署相同的jar并且已经没有服务器在某处运行

  4. 希望它有所帮助,否则会在问题中提供更多信息。

    相关问题:Java RMI proxy issue

答案 1 :(得分:0)

问题是我在服务器和客户端有不同的软件包名称,但分发给客户端的类需要与服务器中的类完全相同..