Java RMI注册表无法找到服务器对象。

3

所以,问题在于我有一些服务器代码,允许客户端使用rmiregistry调用其上的函数。需要注意的是,我是在OS X终端上运行这些命令,而我有两个工作文件夹:

RMI - 它将调用rmiregistry和 Server - 它包含了我所有的服务器代码。

因此,我打开一个终端并输入以下内容:

rmiregistry -J-Djava.rmi.server.codebase=file:/Desktop/RMI/Server/ &

一切都好了,我现在拿到了一个端口。 然后我登录到包含我的服务器代码的“Server”文件夹中运行我的calculatorserver程序。 现在我被告知需要指定代码库和安全策略:

java -Djava.rmi.server.codebase=file:/Desktop/RMI/Server/ -Djava.security.policy=server.policy calculatorserver 

然而,我一直遇到同样的错误:
Server Error: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: calculator

我知道出现这个错误的唯一原因是rmiregistry找不到服务器对象。

如果能提供一些指导就更好了。

1个回答

0

这不是一个真正的HTTP URL。它只是一个目录名,在前面加上了http:。你需要使用一个真正的http: URL和一个真正的HTTP服务器。或者FTP。

你可以使用一个file: URL,但是这样你基本上被限制在一个单一的主机内,这种情况下你实际上根本不需要代码库功能。如果你确实使用了file: URL,它必须对注册表和客户端可读,这意味着它们都在同一个主机上,或者它命名了一个注册表和客户端都能看到的共享目录。

NB 不要向注册表(或客户端,除非它导出远程(回调)对象)指定代码库:只向服务器JVM指定


我的错误,我将它作为“file:”URL记录下来了 - 粘贴了错误的剪贴板。这就是我想要的。您指定代码库到服务器JVM时确切意思是什么? - Papantonia
指定代码库 = -Djava.rmi.server.codebase=...。您应该只将该参数指定给服务器JVM,或更一般地指定给导出需要代码库的远程对象的JVM。注册表不是其中之一。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接