2012-04-21 5 views
2

저는 RMI 자습서에 문제가있는 다른 사람들의 답을 찾기 위해 꽤 오래 동안 노력했지만이 문제에 완전히 몰두했습니다. 나는 이클립스를 통해이 튜토리얼을하고있다.ComputeEngine의 RMI 자습서 오류

내 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를 사용하여 프로그램을 실행하면 오류가 발생했는지 정확히 알 수 없습니다.