新並行/分佈式計算和我正在嘗試編寫的客戶端 - 服務器程序有問題。應該發生的事情是服務器從客戶端收到一個整數,然後將總和的所有數字(例如,用戶輸入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");
任何人有任何經驗的故障排除這個錯誤?
謝謝!
Thanks for超級快速的迴應。我試着在安全管理器之前設置系統屬性,並得到一個AccessControlException,拒絕套接字的權限。當我將安全管理員完全取出時,我得到一個UnmarshalException指向接口。但是我不能將安全管理器添加到接口,我可以嗎?添加它不會編譯。 – bluebrooklynbrim
這意味着您沒有將接口類部署到RMI註冊表CLASSPATH或客戶端,具體取決於您何時發生異常。 – EJP