2012-04-21 89 views
2

因此,我花了很長時間試圖從其他人在RMI教程中遇到問題找到答案,但我完全無法理解這一點。我正在通過eclipse來完成這個教程。ComputeEngine的RMI教程錯誤

我的ComputeEngine類。這只是從教程中複製的,所以我不認爲它有任何問題。

import java.rmi.RMISecurityManager; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.rmi.server.UnicastRemoteObject; 
import compute.Compute; 
import compute.Task; 

public class ComputeEngine implements Compute { 

    public ComputeEngine() { 
     super(); 
    } 

    public <T> T executeTask(Task<T> t) { 
     return t.execute(); 
    } 

    public static void main(String[] args) { 
     if (System.getSecurityManager() == null) { 
      System.setSecurityManager(new RMISecurityManager()); 
     } 
     try { 
      String name = "Compute"; 
      Compute engine = new ComputeEngine(); 
      Compute stub = (Compute) UnicastRemoteObject.exportObject(engine, 0); 
      Registry registry = LocateRegistry.getRegistry(); 
      registry.rebind(name, stub); 
      System.out.println("ComputeEngine bound"); 
     } catch (Exception e) { 
      System.err.println("ComputeEngine exception:"); 
      e.printStackTrace(); 
     } 
    } 
} 

我開始在命令行rmiregistry中與

set classpath= 
start rmiregistry 

在Eclipse我VM參數是:

-Djava.rmi.server.codebase=file:/C:/Users/Kevin/workspace/RMI/bin/ 
-Djava.rmi.server.hostname=Compute 
-Djava.security.policy=server.policy 

我有compute.jar文件和中的server.policy bin文件夾中的文件。我授予了策略文件的所有權限。

grant{ 
    permission java.security.AllPermission; 
}; 

畢竟,我跑COMPUTEENGINE並獲得以下錯誤:

ComputeEngine exception: 
java.security.AccessControlException: access denied (java.net.SocketPermission   127.0.0.1:1099 connect,resolve) 
at java.security.AccessControlContext.checkPermission(Unknown Source) 
at java.security.AccessController.checkPermission(Unknown Source) 
at java.lang.SecurityManager.checkPermission(Unknown Source) 
at java.lang.SecurityManager.checkConnect(Unknown Source) 
at java.net.Socket.connect(Unknown Source) 
at java.net.Socket.connect(Unknown Source) 
at java.net.Socket.<init>(Unknown Source) 
at java.net.Socket.<init>(Unknown Source) 
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source) 
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source) 
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source) 
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source) 
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source) 
at sun.rmi.server.UnicastRef.newCall(Unknown Source) 
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
at engine.ComputeEngine.main(ComputeEngine.java:31) 

現在看來似乎有某種與重新綁定問題,但我不明白。當我有策略文件時,我也不理解AccessControlException。我已經檢查過,以確保rmiregistry仍在運行,並且我沒有關閉啓動後出現的空白窗口。

所以是的,我迷路了。

回答

-1

這個例外清楚地表明您的代碼庫沒有創建套接字/網絡通信的權限。原因可能僅在於您的安全策略規範。請勿明確指定策略文件並允許JVM使用默認安全策略。默認策略指定正確的權限,所以你應該沒問題。

+0

當它指定AllPermission時,他的「安全規範本身」如何會成爲問題? – EJP 2012-04-21 08:49:47

+0

您的政策文件可能不會被引用。你只提到文件名,而不是完整的路徑。因此,文件是否會被引用將取決於您如何以及從何處啓動程序。您可以根本不指定策略,以便JVM引用缺省策略文件或提及文件的完整路徑。 – Drona 2012-04-22 05:00:20

1

顯然你的安全策略文件不是找到。當您執行程序時,它需要位於當前工作目錄中。用-Djava.security.debug =訪問運行你的程序,不能看到究竟發生了什麼。