我尝试通过 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实例的私有(private)IP地址。另一方面,客户端有这一行 - 即上面的第 11 行:
RmiServerIntf obj = (RmiServerIntf)Naming.lookup("rmi://54.229.66.114:1099/RmiServer");
这是该实例的公共(public)IP。另外,在客户端,我将代码库属性设置为:
System.setProperty("java.rmi.server.codebase", "C:\\Users\\spacitron\\Projects\\RMIClient\\bin");
如果我尝试在服务器上添加同一行,则会收到“权限被拒绝”错误。
最佳答案
代码库是 URL 列表。您指定的是文件名,而不是 URL。
这也是一个相当无用的文件名,除非客户端与服务器位于同一主机上,在这种情况下,很难理解为什么要使用代码库功能。即使您有共享驱动器,也可以像使用 java.rmi.server.codebase 一样轻松地在客户端的 CLASSPATH 中指定目录。代码库 URL 需要可以通过以下方式使用:收件人。这就是为什么它们几乎总是 HTTP URL,或者可能是 FTP URL。
关于java - RMI 异常。无法连接到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17711300/