简体   繁体   English

Java RMI UnmarshalException和AWS EC2服务器

[英]Java RMI UnmarshalException and AWS EC2 Server

I'm trying to implement the RMI Compute PI tutorial found on the Sun/Oracle website here . 我试图实现太阳/ Oracle的网站上找到了RMI计算PI教程这里 The server is located on an Amazon windows EC2 Server. 该服务器位于Amazon Windows EC2服务器上。 The client is located on my personal computer at home. 客户端位于我家里的个人计算机上。 Just to keep things simple, I have disabled the firewall on the server and open all the port on the EC2 security group. 为了简单起见,我禁用了服务器上的防火墙,并打开了EC2安全组上的所有端口。 I can ping the machine, have access to files, etc... My aim is just to have a basic RMI program worked on AWS. 我可以对计算机执行ping操作,可以访问文件等。我的目标只是在AWS上运行一个基本的RMI程序。 I will oversee security issues later. 稍后我将监督安全问题。

Lauching the server is not a problem. 启动服务器不是问题。 And it's correctly bound to the RMI Registry. 并且它已正确绑定到RMI注册表。 I'm using the following command to launch it : 我正在使用以下命令启动它:

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

  • The RMI registry is started on the server side. RMI注册表在服务器端启动。
  • I have declared a new security manager on the server side System.setSecurityManager(new RMISecurityManager()) 我已经在服务器端声明了一个新的安全管理器System.setSecurityManager(new RMISecurityManager())
  • I'm using a security.policy file where I'm granted all permission. 我使用的是security.policy文件,该文件已获得所有权限。

When I'm launching the client side, on my local computer, I'm ending with an UnmarshalException: 当启动客户端时,在本地计算机上,我以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

Do you have any suggestions of what is wrong ? 您对什么地方有任何建议吗? Why can't the client find the correct Stub ? 客户为什么找不到正确的存根? I'm using Eclipse Juno, Genady RMI Plugin and Java 1.7.0_07. 我正在使用Eclipse Juno,Genady RMI插件和Java 1.7.0_07。

Thanks for your help 谢谢你的帮助

EDIT 1 : 编辑1:

The Java workspace is organized around 3 projects : the Client side, the Server Side and a Common project where both the server and the client share classes. Java工作区围绕3个项目进行组织:客户端,服务器端和一个Common项目,服务器和客户端都共享类。

  • I can read the remote registry from my local computer. 我可以从本地计算机读取远程注册表。 The RMI plugin can connect remotely to the server and inspect the registry. RMI插件可以远程连接到服务器并检查注册表。

  • If instead of making 3 projects I put all the classes under the same project, everything is working fine... But I notice that no stubs where generated (or needed). 如果不是将3个项目都放在同一个项目下,而是将所有类都放在一个项目下,那么一切都很好……但是我注意到没有生成(或需要)任何存根。

  • If, on the client side, I'm putting a reference in the classpath to the server classes (everything being build locally), i have a connection timeout error instead of the unmarshalling error. 如果在客户端,我在类路径中放置了对服务器类的引用(所有内容都在本地构建),那么我将出现连接超时错误而不是解组错误。

    ComputePi exception: Connection refused to host: XX.XXX.XX.XX; ComputePi异常:连接拒绝托管:XX.XXX.XX.XX; nested exception is: java.net.ConnectException: Connection timed out: connect java.rmi.ConnectException: Connection refused to host: XX.XXX.XXX; 嵌套的异常是:java.net.ConnectException:连接超时:connect java.rmi.ConnectException:连接被拒绝托管给主机:XX.XXX.XXX; nested exception is: java.net.ConnectException: Connection timed out: connect at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java: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) Caused by: java.net.ConnectException: Connection timed out: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157) at java.net.Socks 嵌套的异常是:java.net.ConnectException:连接超时:在sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java)处的sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)连接:216)在sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)在sun.rmi.server.UnicastRef.invoke(UnicastRef.java:128)在engine.ComputeEngine_Stub.executeTask(ComputeEngine_Stub.java: 35)在client.ComputePi.main(ComputePi.java:19)造成原因:java.net.ConnectException:连接超时:在java.net.DualStackPlainSocketImpl.connect0(本机方法)处进行连接。 DualStackPlainSocketImpl.java:69)(java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)at 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) at java.net.Socket.connect(Socket.java:579) at java.net.Socket.connect(Socket.java:528) at 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 more SocketImpl.connect(SocksSocketImpl.java:391)at java.net.Socket.connect(Socket.java:579)at java.net.Socket.connect(Socket.java:528)at java.net.Socket。(Socket。位于sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)处java.net.Socket。(Socket.java:208)处的sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket( RMIMasterSocketFactory.java:146)位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)...还有5个

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM