13

我需要您在 JAVA RMI 方面的帮助,我开发了一个用于对表进行排序的示例程序。但我得到了这个例外:

Erreur RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: ServicesTableau

这是我的服务器源代码:

public class Serveur {
    public static void main(String args[]) {

        try {

            System.out.println("Server start ...");
            ServicesTableauImpl od = new ServicesTableauImpl();
            String url = "rmi://" + args[0] + "/ServicesTableauImpl";
            System.out.println("Passe");
            Naming.rebind(url, od);
            System.out.println("Attente d'invocations de client / CTRL-C pour stopper");
        } catch (Exception e) {
            System.out.println("Erreur " + e.getMessage());
        }
    /*
    catch(java.net.MalformatedURLException e){
    System.out.println("Mauvais nom de serveur");
    System.exit(1);
    }
    catch(RemoteException e){
    System.out.println("Pas de Rmiregistry");
    System.exit(1);
    }
    */
    }
}
4

6 回答 6

18

该类在 RMI 注册表的 CLASSPATH 中不可用。修复它的最简单方法是在同一个 JVM 中启动 Registry,通过LocateRegistry.createRegistry().将结果存储在静态字段中。

于 2012-12-28T23:58:04.193 回答
7

这发生在我身上是因为我没有rmiregistry在与服务器相同的目录中运行。

于 2019-02-21T12:07:10.697 回答
0

我花了几个小时成功启动了 Orcale 的简单示例表单!

希望能帮到你

首先,我在 Windows 上运行程序

我完全从这里复制代码

但我删除了包并将三个 .class 文件放在一起以说服

如果您对此不熟悉,我希望您也最好这样做

因为当包裹进来时,问题会更复杂

需要做三个步骤:

1.启动rmiregistry

start rmiregistry -J-Djava.class.path=./

它用于“远程接口定义”

以便 rmiregistry 可以找到该类

然后解决 ClassNotFoundException

2.运行服务器

start java Server

然后你可以看到输出:

服务器就绪

3.运行客户端

java Client

输出:

回应:你好,世界!

然后说说如何处理包

通常是Server.class和interface.class---“远程接口定义”

应该在同一个包中

并且您需要知道如何使用包运行 .class

java {packagename}.Server

类路径默认为“./”

和包声明将有助于找到 Server.class 所需的 interface.class

所以我们不需要单独设置-cp

顺便说一句,如果你尝试设置真正的类路径,你会得到错误

至于“启动rmiregistry”

它没有默认的类路径

所以我们需要设置它

它应该与类路径的默认值“./”相同

于 2020-11-08T08:46:00.867 回答
-1

在某些情况下,您需要将 rmi 客户端代码(接口和主代码)移动到默认包。在服务器端重复它。它可以解决您的问题(在 rmi 中使用包装并不那么明显)。

于 2017-02-14T15:14:37.503 回答
-1

答案是基于 IDE 的项目。

您需要从 build 文件夹中“启动 rmiregistry ”。

例如:在Intellij

  1. 在“目标 -> 类”文件夹中打开终端
  2. 运行“启动 rmiregistry”
  3. 然后使用 intellij 运行您的服务器代码

对于 Eclipse 我希望它的构建文件夹

于 2021-03-10T16:26:47.737 回答
-3

此错误是因为未编写安全管理器代码,因此无法加载该类。因此,请确保为安全管理器添加代码。 
如果编译器没有找到安全管理器,则创建一个新的。在 main 方法中添加代码。

if (System.getSecurityManager() == null) then
    System.setSecurityManager(new RMISecurityManager())
于 2014-10-09T03:22:04.610 回答