RMI连接被拒绝

时间:2010-11-18 11:28:04

标签: java rmi hosts rmiregistry

我正在努力获得rmi连接。我遇到了很多安全问题,但一直无法找到解决这一问题的方法。我执行我的jar文件:

java -Djava.security.policy=java.security.AllPermission -jar "myjarfile"

我用来创建它的代码是:

public class server
{
    public static void main(String args[])throws Exception
    {
    if (System.getSecurityManager() == null)
        System.setSecurityManager ( new RMISecurityManager() {
        public void checkConnect (String host, int port) {}
        public void checkConnect (String host, int port, Object context) {}
        });

    try
    {
        sampleserverimpl server = new sampleserverimpl();
        System.out.println("SERVER IS WAITING");
        LocateRegistry.createRegistry(2020);

        //Runtime.getRuntime().exec("rmiregistry 2020");
        Naming.rebind("//localhost:2020/SERVER", server);

    }
    catch(Exception e)
    {
        System.out.println(e);
    }
}
};

我收到的错误跟踪是:

Exception in thread "RMI TCP Connection(idle)" java.security.AccessControlExcept
ion: access denied (java.net.SocketPermission 127.0.0.1:31199 accept,resolve)jav
a.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:

    java.io.EOFException

我尝试了不同的方法来解决这个问题,有人能在这里看到问题吗?

由于

2 个答案:

答案 0 :(得分:6)

-Djava.security.policy接受指向策略文件的URL,该策略文件又包含权限。因此,您应该将-Djava.security.policy=/some/path/my.policy作为my.policy文件包含的JVM参数:

grant {
  permission java.security.AllPermission;
};

此外,为了避免代码中出现NULL检查并手动创建SecurityManager,您可以通过传递JVM开关请求为您的应用程序自动安装SecurityManager:-Djava.security.manager

您的最终JVM调用应如下所示:

java -Djava.security.manager -Djava.security.policy=/some/path/my.policy

答案 1 :(得分:0)

这是两个独立的例外。第一个是权限问题。第二个,即EOFException,可能有多种原因。我需要看看java -version和完整的堆栈跟踪来进一步协助。