1

新並行/分佈式計算和我正在嘗試編寫的客戶端 - 服務器程序有問題。應該發生的事情是服務器從客戶端收到一個整數,然後將總和的所有數字(例如,用戶輸入5,服務器計算1 + 2 + 3 + 4 + 5,服務器返回15)返回總和。我仍然試圖弄清楚,所以我在客戶端硬編碼輸入。拒絕訪問屬性權限的Java

這是我在服務器端:

import java.rmi.*; 
import java.rmi.server.*; 
import java.rmi.registry.*; 
import java.net.*; 
import java.util.*; 
public class Server { 

public static void main(String[]args) { 

    try{ 
     int port = 16790; 
     String host = "localhost"; 
     CalculateSumServerImpl export = new CalculateSumServerImpl(); 
     LocateRegistry.createRegistry(port); 
     String registryURL = "rmi://" + host + ":" + port + "/sum"; 
     Naming.rebind(registryURL, export); 
     System.out.println("Server ready"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} } 


//to calculate the sum 
import java.rmi.*; 
import java.rmi.server.*; 

public class CalculateSumServerImpl extends UnicastRemoteObject implements  CalServerInterface { 

public int n; //value entered 
public int sum; //sum 

protected CalculateSumServerImpl() throws RemoteException { 
    super(); 
} 

@Override 
public int calculateSum(int n) throws RemoteException { 

    n = (n*(n+1))/2; //sum of 1 + 2 + 3 + .. + n 

    sum = n; 

    return sum; 
} } 

//interface 
import java.rmi.Remote; 

public interface CalServerInterface extends Remote { 

public int calculateSum(int n) throws java.rmi.RemoteException; 
} 

而且在客戶端:

import java.rmi.*; 
import java.util.PropertyPermission; 

public class Client { 
public static void main(String[]args) { 

    System.setSecurityManager(new java.rmi.RMISecurityManager()); 
    System.setProperty("java.net.preferIPv4Stack" , "true"); 

    try { 
     int port = 16790; 
     String host = "localhost"; 
     String registryURL = "rmi://" + host + ":" + port + "/sum"; 

     Project4ServerInterface obj = (Project4ServerInterface)Naming.lookup(registryURL); 
     System.out.println("Lookup completed."); 

     int output = obj.calculateSum(3); 
     System.out.println("Sum is: " + output); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    System.setProperty("java.net.preferIPv4Stack","true"); 

} } 

我已經實現在客戶端的接口爲好。

,我已經得到客戶端上的錯誤是:

異常線程「main」 java.security.AccessControlException:訪問被拒絕(「java.util.PropertyPermission」「java.net (SecurityController.java:884) at java.lang.SecurityManager.checkPermission(SecurityManager.SecurityIPv4Stack「」write「)在安全管理器上的安全管理器(SecurityManager.checkPermission) .java:549) at java.lang.System.setProperty(System.java:792) at project04client.Client.main(Client.java:10)

與指向符合此代碼中的錯誤:

System.setProperty("java.net.preferIPv4Stack" , "true"); 

任何人有任何經驗的故障排除這個錯誤?

謝謝!

回答

2

問題是,您已經爲整個(客戶端)應用程序設置了安全管理器,該應用程序不會讓您修改系統屬性。

簡單的修復方法是在設置RMI安全管理器之前設置需要設置的系統屬性。

或者,您可能完全擺脫System.setSecurityManager(...)調用。如果您希望客戶端能夠從您的RMI服務中下載課程,您(可能)只需要它。


我嘗試了安全管理器前設置的系統屬性,並得到了一個AccessControlException,否認套接字權限。

這沒有多大意義。如果當時有一位安全管理人員,則只能獲得AccessControlException。不應該有......除非這是在Web瀏覽器中啓動的小程序代碼或類似代碼。另外,我不知道爲什麼設置屬性的調用會被拒絕,說你沒有套接字權限。

當我把安全管理器完全取出時,我得到一個UnmarshalException指向接口。

您還需要添加將解組到客戶端類路徑的對象的類/接口。


其實,我只是注意到javadocRMISecurityManager說:

RMISecurityManager實現等同於通過SecurityManager執行的政策RMI應用程序應該使用SecurityManager類或其他適當SecurityManager的政策。執行代替這個類

+0

Thanks for超級快速的迴應。我試着在安全管理器之前設置系統屬性,並得到一個AccessControlException,拒絕套接字的權限。當我將安全管理員完全取出時,我得到一個UnmarshalException指向接口。但是我不能將安全管理器添加到接口,我可以嗎?添加它不會編譯。 – bluebrooklynbrim

+0

這意味着您沒有將接口類部署到RMI註冊表CLASSPATH或客戶端,具體取決於您何時發生異常。 – EJP

相關問題