2016-11-21 217 views
0

我試圖從Oracle教程中獲得這些Java RMI Trails工作,但我似乎無法做到。我不斷收到試圖啓動服務器時出現以下錯誤:如何使用RMI註冊表註冊遠程對象?

java.security.AccessControlException: access denied ("java.net.SocketPermission" 
"127.0.0.1:1099" "connect,resolve") 

跟蹤點的registry.rebind(name, stub);

該項目的invokation是一個服務器應用程序到一個可以發送任務(遠程接口)和提供了一個遠程接口計算,以執行此任務。應用程序的客戶端提供了一個計算Pi的Task的實現。

當試圖遵循這個我已經成立了兩個項目「COMPUTEENGINE」和「ComputeClient」爲: Project structure

其中「compute.jar」包含接口計算和任務。

我做了:'啓動rmiregistry'之前嘗試啓動服務器(不知道我在開始客戶端之前雖然)。

任何提示什麼是worng?它與安全策略有什麼關係,我不確定我是否理解他們的工作?

的代碼可以在提供太鏈接找到,但我會在這裏發佈,以及:

ComputeEngine.java

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 SecurityManager()); 
     } 
     try { 
      String name = "Compute"; 
      Compute engine = new ComputeEngine(); 
      Compute stub = 
       (Compute) UnicastRemoteObject.exportObject(engine, 0); 
      Registry registry = LocateRegistry.getRegistry(); 
      registry.rebind(name, stub); // <-- This is where the error points. 
      System.out.println("ComputeEngine bound"); 
     } catch (Exception e) { 
      System.err.println("ComputeEngine exception:"); 
      e.printStackTrace(); 
     } 
    } 
} 

Compute.java

public interface Compute extends Remote { 
    <T> T executeTask(Task<T> t) throws RemoteException; 
} 

任務。 java

public interface Task<T> { 
    T execute(); 
} 

CopmutePi.java

public class ComputePi { 
    public static void main(String args[]) { 
     if (System.getSecurityManager() == null) { 
      System.setSecurityManager(new SecurityManager()); 
     } 
     try { 
      String name = "Compute"; 
      Registry registry = LocateRegistry.getRegistry(args[0]); 
      Compute comp = (Compute) registry.lookup(name); 
      Pi task = new Pi(Integer.parseInt(args[1])); 
      BigDecimal pi = comp.executeTask(task); 
      System.out.println(pi); 
     } catch (Exception e) { 
      System.err.println("ComputePi exception:"); 
      e.printStackTrace(); 
     } 
    }  
} 

Pi.java

public class Pi implements Task<BigDecimal>, Serializable { 

    private static final long serialVersionUID = 227L; 

    private static final BigDecimal FOUR = 
     BigDecimal.valueOf(4); 

    private static final int roundingMode = 
     BigDecimal.ROUND_HALF_EVEN; 

    private final int digits; 

    public Pi(int digits) { 
     this.digits = digits; 
    } 

    public BigDecimal execute() { 
     return computePi(digits); 
    } 

    public static BigDecimal computePi(int digits) { 
     // computing Pi... 
    }  
} 

回答

0

擺脫安全管理器和代碼庫的功能,然後再試一次。如果您使用代碼庫功能,則只需要安全管理員,如果要使用它來部署應用程序,則只需要代碼庫功能。這是可選的,通常不用,至少在教程階段。

+0

非常感謝您的回答,我沒有安全管理員就進一步瞭解,因爲我在沒有投訴的情況下運行服務器。但是,當我嘗試啓動客戶端時,出現錯誤:java.rmi.ServerException:在服務器線程中發生了RemoteException;嵌套的異常是: \t java.rmi.UnmarshalException:error unmarshalling arguments;嵌套的異常是: \t java.lang.ClassNotFoundException:client.Pi(沒有安全管理器:禁用RMI類加載器)'有什麼想法? –

+0

您需要通過其CLASSPATH在服務器上部署在例外中指定的類。 – EJP