2016-04-12 3 views
0

Я пытаюсь создать сервер RMI, но я получаю следующее исключение во время выполнения:Java RMI/отказано в доступе

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

Я прочитал Oracle учебник о файлах политики, здесь содержание моего сервера. файл политики, который я вставил в папку Src:

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

permission java.security.AllPermission; 

}; 

Я также установить параметры виртуальной машины для:

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

Наконец, вот код этого простого сервера RMI:

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();} 


} 

Спасибо за вашу помощь.

ответ

0

Папка C:/EclipseProjects/MultiServiceServer/src не будет находиться во время выполнения и не будет содержать файлы .class во время компиляции. Таким образом, предоставление любых разрешений бесполезно. Вам вообще не нужно использовать диспетчера безопасности в RMI, если вы не используете функцию codebase. которым вы не являетесь. Поэтому удалите диспетчера безопасности.

+0

Если я не использую диспетчер безопасности, я получу другое исключение (без управления безопасностью: RMI classloader отключено), когда я пытаюсь работать с клиентской стороны на объект на стороне сервера. Я прочитал, что менеджер безопасности должен иметь возможность загружать классы через RMI. – freestar

+0

В сообщении говорится «ClassNotFoundException», и в скобках упоминается «(нет менеджера безопасности)» в виде замечания. * Проблема * не является «никаким менеджером безопасности», это «ClassNotFoundException». Решение заключается не в том, чтобы добавить менеджера безопасности, а в том, чтобы добавить отсутствующий класс в путь класса JVM, который генерирует исключение. Менеджер безопасности требуется в соответствии с условиями, указанными мной, и другими. – EJP

Смежные вопросы