0
我有一個RMI應用程序,它在我的macbook-pro(10.9.2)上運行正常,但是當我在Unix服務器上部署它時,客戶端拋出上述異常。我正在使用codebase屬性來查看遠程機器之間的應用程序。RMI客戶端在查找時拋出「error unmarshalling return」異常
這就是我對服務器端(它啓動罰款):
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
我知道我可能在做一些愚蠢的錯誤,在客戶端尋求的協議是我設置爲鱈魚服務器端的ebase屬性。我怎樣才能解決這個問題?