2016-04-12 13 views
0

Ich versuche, eine RMI-Server zu erstellen, aber ich bekomme die folgende Ausnahme zur Laufzeit:Java RMI/Zugriff verweigert

java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:4555" "listen,resolve") 

Ich habe die Oracle-Tutorial über die Richtliniendateien lesen, hier ist der Inhalt meines Servers. Policy-Datei, die ich in den Ordner src eingefügt:

grant codeBase "file:///C:/EclipseProjects/MultiServiceServer/src"{ 

permission java.security.AllPermission; 

}; 

ich auch auf VM Argumente gesetzt:

-Djava.security.policy=src/server.policy 

, hier Schließlich ist der Code dieser einfachen RMI-Server:

public class Main { 

public static void main(String[] args) 
{  

    System.out.println("Server is running.."); 

    if (System.getSecurityManager() == null) { 
      System.setSecurityManager(new SecurityManager()); 
    } 

    try { 

     String name = "AvailableService"; 

     AvailableService service = new ServiceList(); 

     AvailableService stub = (AvailableService)UnicastRemoteObject.exportObject(service, 0); 

     LocateRegistry.createRegistry(4555); 

     Registry reg = LocateRegistry.getRegistry(4555); 

     reg.bind(name, stub); 

     System.out.println(name+" bound"); 

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


} 

Vielen Dank für Ihre Hilfe.

Antwort

0

Der Ordner C:/EclipseProjects/MultiServiceServer/src ist zur Laufzeit nicht vorhanden und enthält zur Kompilierungszeit keine .class-Dateien. Es ist daher zwecklos, ihm irgendwelche Berechtigungen zu gewähren. Sie müssen keinen Sicherheitsmanager in RMI verwenden, außer Sie verwenden die Codebasisfunktion. was du nicht bist. Entfernen Sie den Sicherheitsmanager.

+0

Wenn ich den Sicherheitsmanager nicht verwende, erhalte ich eine weitere Ausnahme (kein Sicherheitsmanager: RMI Classloader deaktiviert), wenn ich versuche, von Clientseite zu Objekt auf der Serverseite zu verweisen. Ich habe gelesen, dass der Sicherheitsmanager Klassen über RMI laden muss. – freestar

+0

Die Nachricht sagt 'ClassNotFoundException', und es erwähnt '(kein Sicherheitsmanager)' in Klammern als eine Bemerkung. Das * Problem * ist nicht 'kein Sicherheitsmanager', es ist 'ClassNotFoundException'. Die Lösung besteht darin, den Sicherheitsmanager nicht hinzuzufügen, sondern die fehlende Klasse dem Klassenpfad der JVM hinzuzufügen, der die Ausnahme auslöst. Der Sicherheitsmanager wird unter den angegebenen Bedingungen benötigt und keine anderen. – EJP