在我将文件组织成包之前,这个程序运行正常。我得到的错误信息如下:
ClassCastException:a3.seneca.RemoteMethod_Stub无法强制转换为a3.seneca.RemoteMethod (第35行)
我的包结构如下(大写意味着目录):
-A3
- 服务器
---- DataAccessServer
- SENECA
---- RemoteMethodInterface
---- RemoteMethod
- CLIENT
---- DataAccessClient
错误消息所指的行是:
RemoteMethod rmHandler = (RemoteMethod) Naming.lookup("rmi://localhost:666/location");
事先,在DataAccessServer中,我这样做:
RemoteMethod rm = new RemoteMethod();
Naming.rebind("rmi://localhost:666/location", rm);
要运行的步骤如下:
控制台窗口#1: rmiregistry 666
控制台窗口#2: java a3 \ seneca * .java
java a3 \ server * .java
java a3 \ client * .java
rmic -v1.2 a3.seneca.RemoteMethod
java DataAccessServer
控制台窗口#3:
java a3.client.DataAccessClient
将RemoteMethod_stub.class放入seneca目录。我也尝试在创建后将其复制到客户端目录中。任何关于为什么会发生这种情况的见解将不胜感激。
-Dan
答案 0 :(得分:0)
您正在尝试将存根转换为服务器类。您应该将其强制转换为远程接口。存根不是服务器的实例,它是远程接口的实例。这就是RMI的工作原理,它就是远程接口的用途。
答案 1 :(得分:0)
我有同样的错误。问题是,我也已经将接口(扩展到远程)复制到了客户端。应该将其添加到依赖项而不是复制。
最好的方法是导出该接口的jar。并将其添加到客户端依赖项中并使用它。
希望它会有所帮助:)