难以运行RMI Java

时间:2014-05-13 22:23:09

标签: java rmi

我有一个客户端,一个serverClient和另一个ServerFin。 serverClient在中间,用于客户端和serverFin之间的不同操作。我的代码在localhost上按预期工作。

我的问题是我必须将两台服务器放在同一个目录中(用javac和rmic编译),然后启动rmiregistry。这样它工作正常。我想从原始文件夹(仍在localhost上)运行这两个服务器中的每一个。我尝试过一些东西,但是我得到了通常的java.rmi.NotBoundException或其他异常。

serverClient:

serverClient sC=new serverClient(cars);
Naming.rebind("//localhost/serviceOne", sC);

ServerFin:

ServerFin srv = new ServerFin (prodc);
Naming.rebind("//localhost/serviceTwo", srv);

我使用

正常访问它们
String dest = "//localhost/serviceOne";
MyClass obj =(MyClass)Naming.lookup(dest);

以上;首先,我编译ServerFin并启动它。然后,我用javac,rmic编译并将存根从ServerFin复制粘贴到serverClient的目录。当我启动serverClient时出现问题。

java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:  java.lang.ClassNotFoundException: xxximpl_stub

我尝试了很多东西,比如Registry registry = LocateRegistry.createRegistry(1099);,但它没有希望。它只是不起作用。

我怎样才能告诉中间服务器客户端连接到已经运行的注册表(使用ServerFin服务),并将其服务存储在那里?

1 个答案:

答案 0 :(得分:2)

如果您使用此代码获取NotBoundException,则需要查找错误的主机。如果服务器在另一台主机上运行,​​则需要在查找URL中使用该主机名。

但绑定网址中的不是。这总是' localhost'。

如果您收到另一个例外,您可以随时考虑告诉我们它是什么。

编辑如果您获得ClassNotFoundException,则有三种情况。

  1. 导出远程对象时得到了它。生成存根,或者在远程对象构造函数中调用super(0)而不是super(),这样您就不需要了。如果远程对象没有扩展UnicastRemoteObject,请使用UnicastRemoteObject.exportObject()和端口号,即使为零,出于同样的原因。

  2. 绑定时得到了它。注册表没有在其CLASSPATH上命名的类。从服务器JVM内部修复或启动注册表,LocateRegistry.createRegistry(),注意将结果存储在静态变量中。

  3. 抬头时你明白了。客户端没有在其CLASSPATH上命名的类。您忘记将其包含在客户端JAR文件中,或者您执行了无效操作,例如将其复制到项目的客户端部分的不同包中:它必须是相同的类,相同的包,并且最好是相同的目标代码。 / p>