Java RMI使用还是不使用SecurityManager

KSK*_*KSK 2 java rmi securitymanager connectexception

经过大量的搜索和反复试验后,我仍然无法确定是否需要安全管理器,如果需要,如何确定它是否可以工作。

启动服务器的代码:

    Registry registry;
    try {
        System.setProperty("java.security.policyfile", "\\\\...\\security.policy");
        if (System.getSecurityManager() == null) {
            RMISecurityManager securityManager = new RMISecurityManager();
            System.setSecurityManager(securityManager);
        }
        registry = LocateRegistry.createRegistry(port);
        registry.bind(serviceName, remote);
        System.out.println("RMI registry created.");
    } catch (RemoteException e) {
        //error means registry already exists
        System.out.println("RMI registry already exists.");
    }
    System.setProperty("java.rmi.server.hostname", hostURL);
    Naming.rebind(hostURL, remote);
Run Code Online (Sandbox Code Playgroud)

服务器上的错误消息:

D:\>java -jar Server.jar
RMI server starting up
RMI registry created.
Exception in thread "main" ...Exception: Unable to start the Remote Server Server[UnicastServerRef [liveRef: [...]]
        at ServiceProvider.start(ServiceProvider.java:64)
        at Server.main(Server.java:76)
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.hostname" "write")
        at java.security.AccessControlContext.checkPermission(Unknown Source)
        at java.security.AccessController.checkPermission(Unknown Source)
        at java.lang.SecurityManager.checkPermission(Unknown Source)
        at java.lang.System.setProperty(Unknown Source)
        at ServiceProvider.start(ServiceProvider.java:61)
        ... 1 more
Run Code Online (Sandbox Code Playgroud)

策略文件:

grant {
   permission java.security.AllPermission;
 }; 
Run Code Online (Sandbox Code Playgroud)

谢谢任何可以帮助的人。

我承认我甚至不确定我是否需要安全管理器,但是当我不使用它时,我得到了以下内容。至少在这里服务器启动了,并且我能够从客户端连接到它(提供的IP地址未用于获得连接,这是在内部确定的)。但是,当我尝试使用服务器中的一种方法,甚至只是“ printTime”时,都会收到以下错误消息,该方法只应在服务器端显示时间。

Exception in thread "main" java.rmi.ConnectException: Connection refused to host: ...IP...; nested exception is: 
java.net.ConnectException: Connection timed out: connect
Run Code Online (Sandbox Code Playgroud)

再次感谢。

编辑:

好的,我已经删除了安全管理器,因为所需的所有类都在我的客户端和服务器项目中都包含的接口内部。@EJP,当您使用Java和RMI时,您显然非常地精通。我重视您的评论。

我继续收到连接超时错误。我意识到这很普遍,但是我已经尝试了所有我能想到的。
我在我的lib文件夹中添加了属性:java.rmi.server.codebase和所有jar文件。

一位朋友告诉我,我的问题是我包括POJO(普通的Java旧对象),它们对于RMI来说太复杂了。但是我所有的POJO都是可序列化的。另外,我能够在本地主机上运行服务器,并使用客户端应用程序访问服务器而不会出现问题。这告诉我RMI可以完成我要的工作。

在远程计算机上运行服务器然后启动客户端之前,不会出现此连接错误。我的客户端可以连接,但是随后挂断了printTime方法。

运行客户端的代码:

  final Registry registry = LocateRegistry.getRegistry(hostURL, port);
  final HXTTDBFInterface serverIX = (HXTTDBFInterface) registry.lookup(serviceName);

  //Start with simple Server Connection Test
  serverIX.printTime();  //CONNECTION TIMED OUT ERROR HERE
  String time = serverIX.getTime();
  System.out.println("Time From Server: " + time);
Run Code Online (Sandbox Code Playgroud)

如果有人对尝试的事情有任何建议,我全神贯注。提前致谢。

进一步说明:我使用了netstat -a命令,它显示:

LocalAddress       ForeignAddress    State
0.0.0.0:1099       SERVERNAME:0      LISTENING
[::]:1099          SERVERNAME:0      LISTENING
XX.XX.XX.XX:53373  SERVERNAME:1099   ESTABLISHED
Run Code Online (Sandbox Code Playgroud)

(在许多其他行中)

这是否意味着它实际上在监听?

use*_*421 5

仅当对等方使用代码库工具为您动态提供类时,才需要为RMI安装安全管理器。否则,是否使用它完全取决于您。除非您知道它是必需的,否则我会避免它。