RMI例外。无法连接到服务器

时间:2013-07-17 22:22:11

标签: java amazon-web-services rmi

我正在尝试通过RMI连接客户端和远程服务器,我收到此错误消息:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
    java.net.MalformedURLException: unknown protocol: c
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Unknown Source)
    at RmiClient.getMessage(RmiClient.java:11)
    at RmiClient.main(RmiClient.java:26)
Caused by: java.net.MalformedURLException: unknown protocol: c
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at sun.rmi.server.LoaderHandler.pathToURLs(Unknown Source)
    at sun.rmi.server.LoaderHandler.getDefaultCodebaseURLs(Unknown Source)
    at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
    at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
    at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
    at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    ... 4 more

以下可能是问题的原因:

服务器有这一行:

Naming.rebind("rmi://172.31.24.66:1099/RmiServer", obj);

指的是EC2实例的私有IP地址。另一方面,客户端有这一行 - 上面是第11行:

RmiServerIntf  obj = (RmiServerIntf)Naming.lookup("rmi://54.229.66.114:1099/RmiServer");

这是该实例的公共IP。此外,在客户端,我将codebase属性设置为:

System.setProperty("java.rmi.server.codebase", "C:\\Users\\spacitron\\Projects\\RMIClient\\bin");

如果我尝试在服务器上添加相同的行,则会收到“权限被拒绝”错误。

2 个答案:

答案 0 :(得分:2)

代码库是一个URL列表。您指定的是文件名,而不是URL。

它也是一个相当无用的文件名,除非客户端与服务器位于同一主机上,在这种情况下很难理解你为什么要使用代码库功能。即使你有一个共享驱动器,在客户端的CLASSPATH中指定目录就像使用java.rmi.server.codebase.一样容易。收件人需要使用代码库URL 。这就是为什么他们这样做了几乎总是HTTP URL,或者可能是FTP URL。

答案 1 :(得分:0)

尝试在更新45下面的更新21 / jdk6下面评分您的jdk7。 再次编译和测试这个工作问题是java.rmi.server.useCodebaseOnly系统属性 请查看下面的链接,了解两种版本的jdk的解决方案

http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/relnotes.html