当我在运行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服务器,我会得到相同的例外,为什么会发生这种情况?
感谢
答案 0 :(得分:2)
ClassCastException
通常意味着
EncoderImpl
未实施EncodeInterface
或几点提示:
检查您是否实现了界面,例如
EncoderImpl extends UnicastRemoteObject implements EncodeInterface
在java serialization的支持下为您的类添加版本ID,例如
static final long serialVersionUID = 10275539472837495L;
清理,重建和重新部署,并重新启动所有内容以确保每个部署相同的jar并且已经没有服务器在某处运行
希望它有所帮助,否则会在问题中提供更多信息。
相关问题:Java RMI proxy issue
答案 1 :(得分:0)
问题是我在服务器和客户端有不同的软件包名称,但分发给客户端的类需要与服务器中的类完全相同..