2017-05-22 66 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,就會動態生成存根對象。基本上,在構建或導出遠程對象時,您總是必須指定一個端口號。如果你不在乎,你可以使用零。

那麼是否有更靈活的方式來創建存根並將其移動到客戶端?

你也不需要這樣做。所以不要。