java.rmi.UnmarshalException : unable to pull client classes by server

标签 java rmi unmarshalling codebase

我在两台机器上设置了一个 RMI 客户端/服务器,当服务器不需要客户端定义的类时,它们在简单的情况下工作正常。但是,当我需要使用在客户端定义的类时,我无法让服务器解码这些类。我怀疑这是我作为参数传递给客户端应用程序的 java.rmi.server.codebase 属性的问题。我遵循了 Sun 的 RMI 教程跟踪,我认为我已经完全遵循了这些步骤,只是在执行客户端和服务器时我没有指定类路径参数,因为它们在根包目录正上方的目录中执行(但是我也尝试过没有影响)。

我在尝试执行下面详细描述的不同客户端组合时遇到的异常都是相同的:
RmiServer exception: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: test.MyTask at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:353) at sun.rmi.transport.Transport$1.run(Transport.java:177) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:173) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:636) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142) at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178) at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132) at $Proxy0.execute(Unknown Source) at test.myClient.main(myClient.java:32)
详情如下:

我的客户端/服务器 rmi 设置在路由器后面的家庭网络上。路由器被分配给我将调用的静态 IP 地址 myhostname 。在指向正确机器的路由器中设置了适当的端口映射。

角色、机器、操作系统、IP 地址:
server, venice, linux ubuntu 9.10, 10.0.1.2client, naples, mac os x leopard, 10.0.1.4
我在 /home/andrews/workspace/epsilon/bin 内按如下方式启动服务器端:

1 在默认端口 1099 上启动注册表:
venice% rmiregistry &
2 在端口 2001 上启动 Web 服务器,指向通用接口(interface)的代码库:
venice% java webserver/ClassFileServer 2001 /home/andrew/workspace/epsilon/bin
3 注册服务器对象的启动服务器应用程序(test/myServer 中的主类):
venice% java -Djava.rmi.server.codebase="http://myhostname:2001/" -Djava.security.policy=server.policy -Djava.rmi.server.hostname=myhostname test/myServer &
现在 /Users/andrews/Development/Java/workspace/epsilon/bin 里面的客户端:

1 启动一个本地Web服务器,可以将客户端类服务到服务器(不确定这是否需要,但我添加了我尝试过,但仍然没有成功;我已将端口映射添加到2001到venice的路由器,对于 2002 到 naples )
naples$ java webserver/ClassFileServer 2002 /Users/andrews/Development/Java/workspace/epsilon/bin/
尝试运行客户端(注意:我没有指定 -cp 参数,因为客户端在根包目录的正上方执行):

1 使用 http 主机名尝试 #1
naples$ java -Djava.rmi.server.codebase=http://10.0.1.4:2002/ -Djava.security.policy=client.policy test.myClient myhostname
注意 1:最后的 myhostname 参数被传递给客户端,以便它解析为服务器的 rmi 主机名。

注意 2:我也尝试使用 localhost:2002 而不是 10.0.1.4:2002

注意 3:我尝试使用 myhostname:2002,因为 myhostname 已分配给路由器,并且我已正确设置端口映射,此地址应解析为 naples 而不是 venice
2尝试#2:
naples$ java -Djava.rmi.server.codebase=file:/Users/andrews/Development/Java/workspace/epsilon/bin/ -Djava.security.policy=client.policy test.myClient myhostname
注1:代码库url格式是正确的,我创建了一个小程序将当前文件目录路径转换为url并使用它。使用 file:///Users... 具有相同的效果。

其他注意事项:

1 我的服务器和客户端策略文件正确指定了路径,因为我已经用好的和坏的路径测试了这个设置,并且得到了坏路径的安全异常

2 如果我不使用客户端定义的对象,则此设置有效,客户端正确连接到服务器并且服务器执行。

3 当我将客户端类放在服务器的类路径中的服务器上时,一切正常。

感谢所有帮助。

最佳答案

你真的需要使用RMI吗?我和一个 friend 在学校试过一次,它很慢,比我们之前做的简单的 ObjectOutputStream 网络慢得多。

关于java.rmi.UnmarshalException : unable to pull client classes by server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1897806/

相关文章:

java - TAB 布局宽度

java - Elasticsearch : Consecutive Page navigation using spring-data-elasticsearch results empty after certain limit

java - jpa多个双向多对一关系到同一个字段

java - 通过java更改android中imageView上的图像

java - JAXB 解码 xml 而不使用 package-info.java

java - 无法使用 Jackson 解码 LocalDate 和 LocalTime 类

java - Java 静态方法没有 RMI

java - RMI远程异常: java. lang.ClassNotFoundException

java - 从 XML 响应中解码子元素