我是RMI的新手
我试过这个example。这可以按预期工作。
Calculator.class
CalculatorImpl.class + CalculatorImpl_Stub.class
CalculatorServer.class
+
CalculatorClient.class
实际上我打算在两台不同的PC上进行测试。但不是那样,我开始在两个不同文件夹中的同一台PC上尝试它。
一个文件夹包含服务器:
Calculator.class :interface
CalculatorImpl.class + CalculatorImpl_Stub.class
CalculatorServer.class
另一个文件夹包含客户端:
Calculator.class :这只是上面服务器的Calculator接口的副本
CalculatorClient.class
当我尝试运行时 服务器运行良好
现在,当我运行客户端时,打印出错误:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: CalculatorImpl_Stub (no security manag
er: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at CalculatorClient.main(CalculatorClient.java:12)
Caused by: java.lang.ClassNotFoundException: CalculatorImpl_Stub (no security ma
nager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
... 3 more
为什么?
如何解决此错误?
答案 0 :(得分:1)
在客户端CLASSPATH中,异常中指定的类不可用。所以修复它。必须将远程存根和接口及其所依赖的所有内容分发给客户端。
答案 1 :(得分:1)
您的主要问题是遵循非常过时的RMI示例。这里有一个提示,如果RMI示例包含rmic
(或存根和骨架)的使用,请不要使用它。我建议从sun/oracle tutorial开始。
答案 2 :(得分:0)
此问题的最常见原因是调用UnicastRemoteObject
。exportObject(Remote obj)。从文档中您将看到它返回RemoteStub
的实例,以便存根类必须可用,这只有在您使用rmic
生成时才可用。
请改用UnicastRemoteObject.exportObject(Remote obj, int port)
。它返回一个接口(Remote
),并且在没有最近发布的生成类的情况下工作。