首页 文章

Java RMI UnmarshalException和AWS EC2 Server

提问于
浏览
2

我正在尝试实现Sun / Oracle网站here上的RMI Compute PI教程 . 该服务器位于Amazon Windows EC2服务器上 . 客户端位于我家的个人计算机上 . 为了简单起见,我已经禁用了服务器上的防火墙并打开了EC2安全组上的所有端口 . 我可以ping机器,可以访问文件等...我的目标只是让一个基本的RMI程序在AWS上运行 . 我稍后会监督安全问题 .

使用服务器不是问题 . 它正确绑定到RMI注册表 . 我正在使用以下命令启动它:

java -Djava.security.manager -Djava.security.policy=C:\AWSTest\security.policy -Djava.rmi.server.codebase=file:/C:/AWS/Sources/sun-rmi-tutorial-server/bin/ file:/C:/AWS/Sources/sun-rmi-tutorial-common/bin/ -classpath C:\AWS\Sources\sun-rmi-tutorial-server\bin;C:\AWS\Sources\sun-rmi-tutorial-common\bin engine.ComputeEngine ec2-XX-XX-XX-XXX.ap-southeast-1.compute.amazonaws.com

  • RMI注册表在服务器端启动 .

  • 我在服务器端声明了一个新的安全管理器 System.setSecurityManager(new RMISecurityManager())

  • 我正在使用 security.policy 文件,我获得了所有权限 .

当我在我的本地计算机上启动客户端时,我以UnmarshalException结束:

ComputePi exception: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: engine.ComputeEngine_Stub
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: engine.ComputeEngine_Stub
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Naming.java:101)
    at client.ComputePi.main(ComputePi.java:14)
Caused by: java.lang.ClassNotFoundException: engine.ComputeEngine_Stub
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:453)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:184)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:216)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1593)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
    ... 3 more

你有什么错误的建议吗?为什么客户端找不到正确的Stub?我正在使用Eclipse Juno,Genady RMI插件和Java 1.7.0_07 .

谢谢你的帮助

EDIT 1 :

Java工作区围绕3个项目进行组织:客户端,服务器端和公共项目,其中服务器和客户端共享类 .

  • 我可以从本地计算机上读取远程注册表 . RMI插件可以远程连接到服务器并检查注册表 .

  • 如果不是制作3个项目,而是将所有类放在同一个项目下,一切正常......但我注意到没有生成(或需要)的存根 .

  • 如果在客户端,我将类路径中的引用放到服务器类(本地构建的所有内容),我有连接超时错误而不是解组错误 .

ComputePi异常:连接拒绝主机:XX.XXX.XX.XX;嵌套异常是:java.net.ConnectException:连接超时:连接java.rmi.ConnectException:连接拒绝主机:XX.XXX.XXX;嵌套异常是:java.net.ConnectException:连接超时:在sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java)处连接sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) :216)at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:128)at engine.ComputeEngine_Stub.executeTask(ComputeEngine_Stub.java: 35)at client.ComputePi.main(ComputePi.java:19)引起:java.net.ConnectException:连接超时:连接java.net.DualStackPlainSocketImpl.connect0(本地方法)java.net.DualStackPlainSocketImpl.socketConnect( DualStackPlainSocketImpl.java:69)java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) )在java.net.Socks的java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157) SocketImpl.connect(SocksSocketImpl.java:391),java.net.Socket.connect(Socket.java:579),java.net.Socket.connect(Socket.java:528),java.net.Socket . (Socket . java:425)at java.net.Socket . (Socket.java:208)at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket( RMIMasterSocketFactory.java:146)at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)... 5更多

1 回答

  • 1

    您尚未将存根类部署到客户端 .

相关问题