2012-04-21 16 views
2

RMIチュートリアルで問題を抱えている他の人からの回答を探し出すのにかなり時間を費やしましたが、私はこれを完全に打ち砕いています。私はeclipseを通じてこのチュートリアルをやっています。ComputeEngineでのRMIチュートリアルのエラー

My 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 
日食で

私の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

+0

ポリシーファイルがまったく参照されないことがあります。完全なパスではなく、ファイル名のみを記述します。したがって、ファイルが参照されるかどうかは、プログラムの起動方法と場所によって大きく異なります。 JVMがデフォルトのポリシーファイルを参照するように、またはファイルへの完全なパスを記述するように、ポリシーをまったく指定しないでください。 – Drona

1

あなたのセキュリティポリシーファイルは、明らかにではありません。プログラムを実行するときは、現在の作業ディレクトリに存在する必要があります。 -Djava.security.debug = accessを指定してプログラムを実行すると、何が起きているのかを正確に確認できません。

関連する問題