2013-09-25 2 views
0

Я просматриваю учебное пособие на веб-сайте Sun, попробуйте использовать RMI.java rmi: исключение контроля доступа, доступ запрещен

Но когда я пытаюсь запустить сервер я получаю эту ошибку:

ComputeEngine exception: 
java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve") 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:372) 
    at java.security.AccessController.checkPermission(AccessController.java:559) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051) 
    at java.net.Socket.connect(Socket.java:574) 
    at java.net.Socket.connect(Socket.java:528) 
    at java.net.Socket.<init>(Socket.java:425) 
    at java.net.Socket.<init>(Socket.java:208) 
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146) 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at engine.ComputeEngine.main(ComputeEngine.java:31) 

Может кто-то советы о том, как исправить это? Как я могу избавиться от этого исключения, как его исправить?

Это где я получаю исключение (где я обратил стрелку справа от строки):

package engine; 

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

и, наконец, это, как я начинаю свою программу:

Arguments to program and jvm

Я оставлю следующую соответствующую информацию, которая может быть использована ниже:

Это файл ~/.server_policy:

grant codeBase "file:/home/jenia/Documents/eclipse/workspace/asti01/bin" { 
    permission java.security.AllPermission; 
}; 

Это дерево директории проекта:

/home/jenia/Documents/eclipse/workspace/asti01$ tree 
. 
├── bin 
│   ├── client 
│   │   ├── ComputePi.class 
│   │   └── Pi.class 
│   ├── compute 
│   │   ├── Compute.class 
│   │   └── Task.class 
│   └── engine 
│    └── ComputeEngine.class 
└── src 
    ├── client 
    │   ├── ComputePi.java 
    │   └── Pi.java 
    ├── compute 
    │   ├── Compute.java 
    │   └── Task.java 
    ├── compute.jar 
    └── engine 
     └── ComputeEngine.java 

это дерево папки ~/public_html

/home/jenia/public_html/ 
└── classes 
    ├── client 
    │   └── Pi.class 
    └── compute.jar 
+0

EOFException в RMI обычно возникает из-за проблемы SecurityManager на другом конце. Можете ли вы попробовать его без кодовой базы и менеджеров безопасности? – EJP

+0

Я не понимаю, что вы имеете в виду. –

+0

Если вы не понимаете «без кодовой базы и менеджеров безопасности», я не могу помочь вам в решении вашего старого вопроса. Ваш новый вопрос совершенно другой: см. Ниже. – EJP

ответ

0

Если RMI Сервер реестра работает в Localhost тогда вы должны использовать 127.0.0.1 не 127.0.1.1

Провод в 127.0.0.1 при запуске ComputePi

+0

извините, я не понимаю. передать его где? когда я выполняю команду в оболочке? если да, то как? –

+0

Вы не знаете, как вы управляете своими собственными программами? – EJP

+0

нет сделаю. я не знал, как передать аргумент программе и виртуальной машине Java. но теперь im использует eclipse, и для этого есть текстовые поля. Но я все равно получаю ту же ошибку (на ip 127.0.0.1) –

1
  1. Ответ на ваш первоначальный вопрос в том, что EOFException в RMI обычно является результатом проблемы SecurityManager на другом конце. Попробуйте это без кодовой базы и менеджеров безопасности.

  2. Ответ на вторую версию вашего вопроса заключается в том, что реестр не запущен, а getRegistry() не запускает его. createRegistry() делает.

  3. Ответ на третью версию вашего вопроса такой же, как и в первой версии.

  4. Когда вы пройдете все это до следующей ошибки, которая, без сомнения, будет ClassNotFoundException при связывании, решение заключается в том, чтобы запустить реестр с правильным путём классов.

  5. Когда вы пройти что к следующей ошибке, которая, несомненно, будет ClassNotFoundException при взгляде вверх, решение запустить клиента с правильными классами.

+0

Реестр запущен. Я могу найти его с помощью команды ps. –

+0

Для ясности и помощи будущих читателей это был ответ на ваш второй вопрос. Теперь вы, по крайней мере, третий. Любопытно, что мой первоначальный комментарий об удалении менеджеров безопасности и кодовой базы по-прежнему применяется. – EJP

1

Чтобы подтвердить оригинальный комментарий @ EJP в:

Игнорируйте все в руководстве, связанные с настройкой/использованием в SecurityManager. Не пытайтесь использовать удаленную загрузку кода.Эти «функции» значительно увеличивают сложность использования rmi и 99% пользователей действительно не нужны им.

+0

Я полностью согласен. К сожалению, я сказал точно то же самое несколько часов назад, не сказав этого. – EJP

+1

@EJP - га, увидел ваш ответ, но не прочитал все комментарии к OP. обновлено. – jtahlborn

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