JavaRMI:服务器和客户端在同一个文件夹中工作良好,而在同一台PC的不同文件夹中不工作?

JavaRMI:服务器和客户端在同一个文件夹中工作良好,而在同一台PC的不同文件夹中不工作?,java,rmi,Java,Rmi,我是RMI的新手 我试过这个。这正如预期的那样有效 计算器类 CalculatorImpl.class+CalculatorImpl\u存根.class 计算器服务器类 + CalculatorClient.class 事实上,我计划在两台不同的电脑上进行测试。但我没有这样做,而是开始在同一台电脑的两个不同文件夹中进行测试 服务器上有一个文件夹: Calculator.class:接口 CalculatorImpl.class+CalculatorImpl\u存根.class 计算器服务器类 另

我是RMI的新手

我试过这个。这正如预期的那样有效

计算器类
CalculatorImpl.class+CalculatorImpl\u存根.class
计算器服务器类
+
CalculatorClient.class

事实上,我计划在两台不同的电脑上进行测试。但我没有这样做,而是开始在同一台电脑的两个不同文件夹中进行测试

服务器上有一个文件夹:
Calculator.class:接口
CalculatorImpl.class+CalculatorImpl\u存根.class
计算器服务器类

另一个文件夹包含客户端:
Calculator.class:这只是上面服务器的计算器界面的副本
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
  • 它们在同一文件夹中运行良好
  • 当它们位于两个不同的文件夹中时出错
为什么?

如何解决此错误?

异常中命名的类在客户端类路径中不可用。所以要解决这个问题。远程存根和接口以及它们所依赖的一切都必须分发到客户端。

您的主要问题是遵循一个非常过时的RMI示例。这里有一个提示,如果RMI示例包括使用
rmic
(或存根和骨架),请不要使用它。我建议从开始。

这个问题最常见的原因是调用
UnicastRemoteObject
。。从文档中,您将看到它返回一个
RemoteStub
的实例,因此stub类必须可用,这只有在您使用
rmic
生成时才可能


改用UnicastRemoteObject.exportObject(远程对象,int端口)。它返回一个接口(
Remote
),在没有生成类的情况下使用最新版本

你是在出口时得到的吗?什么时候装订?查找时?@EJP我在运行客户机类时得到它。除了我发布的例外情况,我没有其他信息。相反。您有一个完整的堆栈跟踪,其中只发布了最上面的两行。我更新了错误消息:我更改了
System.out.println中的
catch
子句(“异常为:+e”)
e.printStackTrace()。在这个答案中,您的意思是我需要将存根和接口文件复制到客户机文件夹中(我已经复制了接口,我将尝试复制存根文件夹)。谢谢,我已将接口和存根文件复制到客户机文件夹中,效果很好。