Java 使用ComputeEngine的RMI教程错误

Java 使用ComputeEngine的RMI教程错误,java,eclipse,rmi,Java,Eclipse,Rmi,所以我花了相当长的时间试图从其他对RMI教程有困难的人那里找到答案,但是我完全被这个问题难住了。我正在通过eclipse完成本教程 我的电脑课。这是从教程中抄来的,所以我认为它没有任何问题 import java.rmi.RMISecurityManager; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import jav

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

我的电脑课。这是从教程中抄来的,所以我认为它没有任何问题

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();
        }
    }
}
我在eclipse中的VM参数是:

-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)
计算引擎异常:
java.security.AccessControlException:拒绝访问(java.net.SocketPermission 127.0.0.1:1099连接,解析)
位于java.security.AccessControlContext.checkPermission(未知源)
位于java.security.AccessController.checkPermission(未知源)
位于java.lang.SecurityManager.checkPermission(未知源)
位于java.lang.SecurityManager.checkConnect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket。(未知源)
位于java.net.Socket。(未知源)
位于sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(未知源)
位于sun.rmi.transport.proxy.rmisMasterSocketFactory.createSocket(未知源)
位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(未知源)
位于sun.rmi.transport.tcp.tcpcchannel.createConnection(未知源)
位于sun.rmi.transport.tcp.tcpcchannel.newConnection(未知源)
位于sun.rmi.server.UnicastRef.newCall(未知源)
位于sun.rmi.registry.RegistryImpl_Stub.rebind(未知源)
位于engine.ComputeEngine.main(ComputeEngine.java:31)
似乎它在重新绑定方面有一些问题,但我不明白是什么。当我有策略文件时,我也不理解AccessControlException。我已检查以确保RMI注册表仍在运行,并且不会关闭启动后出现的空窗口


所以是的,我迷路了

例外情况清楚地表明,您的代码库没有为网络通信创建套接字/端口的权限。原因可能仅与您的安全策略规范有关。不要显式指定策略文件,并允许JVM使用默认安全策略。默认策略指定了正确的权限,因此您应该没有问题。

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

当指定AllPermission时,他的“仅安全规范”怎么会有问题?您的策略文件可能根本不会被引用。您只提到文件名,而不是完整的路径。因此,文件是否会被引用将真正取决于您如何以及从何处启动程序。要么根本不指定策略,以便JVM引用默认策略文件,要么提及文件的完整路径。
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)