我有一个RMI应用程序在我的macbook-pro(10.9.2)上正常运行但是当我在Unix服务器上部署它时,客户端会抛出上述异常。我正在使用codebase属性,以便在远程计算机之间使用应用程序。
这是我在服务器端所拥有的(启动正常):
package engine;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import compute.Compute;
public class ComputeEngineStarter {
public static void main(String[] args) {
System.setProperty("java.rmi.server.useCodebaseOnly", "false");
System.setProperty("java.rmi.server.codebase", Compute.class.getProtectionDomain().getCodeSource().toString());
System.setProperty("java.security.policy", "../security/server.policy");
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
String name = "Compute";
Compute engine = new ComputeEngine();
Compute stub =
(Compute) UnicastRemoteObject.exportObject(engine, 0);
Registry registry = LocateRegistry.createRegistry(1099);
registry.rebind(name, stub);
System.out.println("ComputeEngine bound");
} catch (Exception e) {
System.err.println("ComputeEngineStarter exception:");
e.printStackTrace();
}
}}
这就是我在客户端所拥有的:
package client;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.math.BigDecimal;
import compute.Compute;
public class ComputePi {
public static void main(String args[]) {
System.setProperty("java.rmi.server.useCodebaseOnly", "false");
System.setProperty("java.rmi.server.codebase", Pi.class.getProtectionDomain().getCodeSource().getLocation().toString());
System.setProperty("java.security.policy", "../security/clientAllPermission.policy");
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
String name = "Compute";
Registry registry = LocateRegistry.getRegistry();
Compute comp = (Compute) registry.lookup(name); //this line throws the exception
Pi task = new Pi(50);
BigDecimal pi = comp.executeTask(task);
System.out.println(pi);
} catch (Exception e) {
System.err.println("ComputePi exception:");
e.printStackTrace();
}
}
}
完整的例外是:
ComputePi exception:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.net.MalformedURLException: no protocol: (file:/home/rm950/RMISecurityInvestigation/RMISecurityInvestigation2ServerSide/thirdParty/compute.jar
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at client.ComputePi.main(ComputePi.java:36)
Caused by: java.net.MalformedURLException: no protocol: (file:/home/rm950/RMISecurityInvestigation/RMISecurityInvestigation2ServerSide/thirdParty/compute.jar
at java.net.URL.<init>(URL.java:583)
at java.net.URL.<init>(URL.java:480)
at java.net.URL.<init>(URL.java:429)
at sun.rmi.server.LoaderHandler.pathToURLs(LoaderHandler.java:770)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:528)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:257)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1549)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1511)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
... 2 more
我知道我可能做了一些愚蠢的错误,在客户端寻求的协议就是我在服务器端设置的代码库属性。我该如何解决这个问题?
答案 0 :(得分:0)
文件:代码库网址:
使用HTTP,或检查是否需要使用代码库功能。