我試圖從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」爲:
其中「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...
}
}
非常感謝您的回答,我沒有安全管理員就進一步瞭解,因爲我在沒有投訴的情況下運行服務器。但是,當我嘗試啓動客戶端時,出現錯誤:java.rmi.ServerException:在服務器線程中發生了RemoteException;嵌套的異常是: \t java.rmi.UnmarshalException:error unmarshalling arguments;嵌套的異常是: \t java.lang.ClassNotFoundException:client.Pi(沒有安全管理器:禁用RMI類加載器)'有什麼想法? –
您需要通過其CLASSPATH在服務器上部署在例外中指定的類。 – EJP