我正在尝试实施在此处的 Sun/Oracle 网站上找到的 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。
谢谢你的帮助
编辑 1:
Java 工作空间围绕 3 个项目进行组织:客户端、服务器端和一个公共项目,其中服务器和客户端共享类。
我可以从本地计算机读取远程注册表。RMI 插件可以远程连接到服务器并检查注册表。
如果我没有制作 3 个项目,而是将所有类放在同一个项目下,那么一切正常......但我注意到没有生成(或需要)存根。
如果在客户端,我在类路径中引用服务器类(所有内容都在本地构建),我会遇到连接超时错误而不是解组错误。
ComputePi 异常:连接拒绝主机:XX.XXX.XX.XX;嵌套异常是:java.net.ConnectException:连接超时:连接 java.rmi.ConnectException:连接拒绝主机:XX.XXX.XXX;嵌套异常是: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) 在 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 的 java.net.DualStackPlainSocketImpl.connect0(Native Method) 处连接。