【问题标题】:RMI tutorial errors with ComputeEngineComputeEngine 的 RMI 教程错误
【发布时间】:2012-05-02 14:42:28
【问题描述】:

所以我花了很长时间试图从其他人那里找到答案,这些人对 RMI 教程有问题,但我完全被这个难住了。我正在通过eclipse做这个教程。

我的 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

我在 eclipse 中的虚拟机参数是:

-Djava.rmi.server.codebase=file:/C:/Users/Kevin/workspace/RMI/bin/
-Djava.rmi.server.hostname=Compute
-Djava.security.policy=server.policy

我在 bin 文件夹中有 compute.jar 文件和 server.policy 文件。我授予了策略文件的所有权限。

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 仍在运行,并且我没有关闭启动后出现的空窗口。

是的,我迷路了。

【问题讨论】:

    标签: java eclipse rmi


    【解决方案1】:

    很明显,您的安全策略文件没有被找到。当您执行程序时,它需要位于当前工作目录中。使用 -Djava.security.debug=access 运行您的程序,无法查看到底发生了什么。

    【讨论】:

      【解决方案2】:

      异常清楚地表明您的代码库无权创建套接字/进行网络通信。原因可能仅与您的安全策略规范有关。不要显式指定策略文件并允许 JVM 使用默认安全策略。默认策略指定了正确的权限,所以你应该没问题。

      【讨论】:

      • 当它指定 AllPermission 时,他的“单独的安全规范”怎么可能有问题?
      • 您的保单文件可能根本不会被引用。您只提到文件名而不是完整路径。因此,是否会引用该文件实际上取决于您启动程序的方式和位置。要么根本不指定策略,以便 JVM 引用默认策略文件,要么提及文件的完整路径。
      猜你喜欢
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多