因此,我花了相当长的时间试图从其他使用 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 中的 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) 

重新绑定(bind)似乎有某种问题,但我不明白是什么。当我有策略文件时,我也不理解 AccessControlException。我已经检查以确保 rmiregistry 仍在运行,并且我没有关闭启动后出现的空窗口。

是的,我迷路了。

请您参考如下方法:

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!