我有一个客户端,一个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服务),并将其服务存储在那里?
答案 0 :(得分:2)
如果您使用此代码获取NotBoundException,则需要查找错误的主机。如果服务器在另一台主机上运行,则需要在查找URL中使用该主机名。
但绑定网址中的不是。这总是' localhost'。
如果您收到另一个例外,您可以随时考虑告诉我们它是什么。
编辑如果您获得ClassNotFoundException
,则有三种情况。
导出远程对象时得到了它。生成存根,或者在远程对象构造函数中调用super(0)
而不是super()
,这样您就不需要了。如果远程对象没有扩展UnicastRemoteObject
,请使用UnicastRemoteObject.exportObject()
和端口号,即使为零,出于同样的原因。
绑定时得到了它。注册表没有在其CLASSPATH上命名的类。从服务器JVM内部修复或启动注册表,LocateRegistry.createRegistry(),
注意将结果存储在静态变量中。
抬头时你明白了。客户端没有在其CLASSPATH上命名的类。您忘记将其包含在客户端JAR文件中,或者您执行了无效操作,例如将其复制到项目的客户端部分的不同包中:它必须是相同的类,相同的包,并且最好是相同的目标代码。 / p>