2017-05-22 41 views
0

我查看了Java RMI的教程,他们建议在命令行(Windows)中手动执行上述任务。在细节,这意味着:Java RMI-自动创建/复制存根和注册表开始

  • 设置服务器项目的路径JDK/bin文件夹

  • 使用RMIC “ClassImplementingRemoteInterface”

  • 启动rmiregistry的

  • 副本存根文件到客户项目的bin文件夹

我发现,可以通过将以下代码添加到服务器的主要方法来启动注册表。

 `try { 
      java.rmi.registry.LocateRegistry.createRegistry(PORT); 
      System.out.println("RMI registry ready."); 
     } catch (Exception e) { 
      System.out.println("Exception starting RMI registry:"); 
      e.printStackTrace(); 
     } 
    ` 

现在,我通过命令行创建了存根,并将它们复制到客户端项目的bin文件夹中。我很困惑如何自动执行此操作,因为文档建议,不再需要手动创建存根。 Oracle Documentation

那么是否有更灵活的方式来创建存根并将它们移动到客户端?

UPDATE:

要启动的注册表,并发送远程对象,只有方法“java.rmi.registry.LocateRegistry.createRegistry(端口)和” UnicastRemoteObject.exportObject中(对象,端口)是必要的。他们应在服务器的主要方法中实现:

try { 


      java.rmi.registry.LocateRegistry.createRegistry(1099); 
      Connector Hello = new Connector(); 

      IConnector stub = (IConnector) UnicastRemoteObject.exportObject(Hello, 1099); 

      // System.setProperty("java.rmi.server.hostname","134.155.182.118"); 
      Naming.rebind("rmi://localhost/ABC", Hello); 

      System.out.println("Addition Server is ready."); 
      }catch (Exception e) { 
       System.out.println("Addition Server failed: " + e); 
      } 
+0

您需要将'LocateRegistry.createRegistry()'的结果存储到一个静态变量中,以防止它被GC'd。 – EJP

+0

您需要在执行任何RMI代码之前设置* all *系统属性。你的'java.rmi.server.hostname'不会生效。 – EJP

回答

2

我很困惑如何,因为文件是在暗示这个自动化,即手动创建存根不再是必需的。

正确。只要您满足Javadoc序言中所述的条件UnicastRemoteObject,就会动态生成存根对象。基本上,在构建或导出远程对象时,您总是必须指定一个端口号。如果你不在乎,你可以使用零。

那么是否有更灵活的方式来创建存根并将其移动到客户端?

你也不需要这样做。所以不要。