亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

RMI、CORBA、IIOP簡單實例--1. RMI

系統 2525 0

分布式對象技術主要是在分布式異構環境下建立應用系統框架和對象構件。在應用系統框架的支撐下,開發者可以將軟件功能封裝為更易管理和使用的對象,這些對象可以跨越不同的軟、硬件平臺進行互操作。目前,分布式互操作標準主要有Microsoft的COM/DCOM標準、Sun公司的Java RMI標準和OMG組織的CORBA標準。
Java RMI簡介

遠程方法調用(RMI,Remote Method Invocation)是jdk1.1中引入的分布式對象軟件包,它的出現大大簡化了分布異構環境中Java應用之間的通信。

要使用RMI,必須構建四個主要的類:遠程對象的本地接口、遠程對象實現、RMI客戶機和RMI服務器。RMI服務器生成遠程對象實現的一個實例,并用一個專有的URL注冊。RMI客戶機在遠程RMI服務器上查找服務對象,并將它轉換成本地接口類型,然后像對待一個本地對象一樣使用它。

下面是一個簡單的RMI實例,RMI客戶機通過RMI服務器提供的方法輸出一個語句。例子雖然很簡單,但掌握了Java RMI調用的基本原理和方法,在實現復雜應用時,我們需要做的也只是完善遠程對象的實現類而已。
RMI實例分析

1.遠程對象的本地接口聲明(RMIOperate.java)

· 該類僅僅是一個接口聲明,RMI客戶機可以直接使用它,RMI服務器必須通過一個遠程對象來實現它,并用某個專有的URL注冊它的一個實例。
· 遠程接口擴展 java.rmi.Remote 接口。
· 除了所有應用程序特定的例外之外,每個方法還必須在 throws 子句中聲明 java.rmi.RemoteException (或 RemoteException 的父類)。
Hello.java
              
/* * @author javamxj (CSDN Blog) 創建日期 2004-12-27 */ import java . rmi . * ; // RMI本地接口必須從Remote接口派生 public interface Hello extends Remote { // 接口中的具體方法聲明,注意必須聲明拋出RemoteException String sayHello( String name) throws RemoteException ; }
2.遠程對象實現類

這個類應實現RMI客戶機調用的遠程服務對象的本地接口,它必須從UnicastRemoteObject繼承,構造函數應拋出RemoteException異常。

HelloImpl.java

              
                  
                    /*
                  
                  
                     * @author javamxj (CSDN Blog) 創建日期 2004-12-27
                  
                  
                     */
                  
                  
                    import
                  
                  
                     java
                  
                  
                    .
                  
                  
                    rmi
                  
                  
                    .
                  
                  
                    *
                  
                  
                    ;
                  
                  
                    import
                  
                  
                     javax
                  
                  
                    .
                  
                  
                    rmi
                  
                  
                    .
                  
                  
                    PortableRemoteObject
                  
                  
                    ;
                  
                  
                    public
                  
                  
                    class
                  
                   HelloImpl 
                  
                    extends
                  
                   PortableRemoteObject 
                  
                    implements
                  
                   Hello {
    
                  
                    /* 構造函數 */
                  
                  
                    public
                  
                   HelloImpl() 
                  
                    throws
                  
                  
                    RemoteException
                  
                   {
        
                  
                    super
                  
                  ();
    }
    
                  
                    /* 實現本地接口中聲明的'sayHello()'方法 */
                  
                  
                    public
                  
                  
                    String
                  
                   sayHello(
                  
                    String
                  
                   message) 
                  
                    throws
                  
                  
                    RemoteException
                  
                   {
        
                  
                    System
                  
                  .out.println(
                  
                    "我在RMI的服務器端,客戶端正在調用'sayHello'方法。 "
                  
                  );
        
                  
                    System
                  
                  .out.println(
                  
                    "Hello  "
                  
                   + message);
        
                  
                    return
                  
                   message;
    }
}

                
3.RMI服務器類

該類創建遠程對象實現類HelloImpl的一個實例,然后通過一個專有的URL來注冊它。所謂注冊就是通過Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,將HelloImpl實例綁定到指定的URL上。

HelloServer.java

              
                
                  /*
                
                
                   * @author javamxj (CSDN Blog) 創建日期 2004-12-27
                
                
                   */
                
                
                  import
                
                
                   java
                
                
                  .
                
                
                  rmi
                
                
                  .
                
                
                  *
                
                
                  ;
                
                
                  public
                
                
                  class
                
                 HelloServer {
    
                
                  public
                
                
                  static
                
                
                  void
                
                 main(
                
                  String
                
                [] args) {
        
                
                  // 在服務器端設置安全機制         
                
                
                  /*
                
                
                             if (System.getSecurityManager() == null) {
                
                
                                 System.setSecurityManager(new RMISecurityManager()); 
                
                
                             }
                
                
                          */
                
                
                  try
                
                 {
            
                
                  System
                
                .out.println(
                
                  "開始 RMI Server ..."
                
                );
            
                
                  /* 創建遠程對象的實現實例 */
                
                
            HelloImpl hImpl = 
                
                  new
                
                 HelloImpl();
            
                
                  System
                
                .out.println(
                
                  "將實例注冊到專有的URL "
                
                );
            
                
                  Naming
                
                .rebind(
                
                  "HelloService"
                
                , hImpl);
            
            
                
                  System
                
                .out.println(
                
                  "等待RMI客戶端調用..."
                
                );
            
                
                  System
                
                .out.println(
                
                  ""
                
                );
        } 
                
                  catch
                
                 (
                
                  Exception
                
                 e) {
            
                
                  System
                
                .out.println(
                
                  "錯誤: "
                
                 + e);
        }
    }
}
              

請注意有關 rebind 方法調用的下列參數:

  • 第一個參數是 URL 格式的 java.lang.String ,表示遠程對象的位置和名字。
    • 需要將 myhost 的值更改為服務器名或 IP 地址。否則,如果在 URL 中省略,則主機缺省值為當前主機,而且在 URL 中無需指定協議(例如“ HelloServer ”)。
    • 在 URL 中,可以選擇提供端口號:例如“/ /myhost:1234/HelloServer”。 端口缺省值為 1099。除非服務器在缺省 1099 端口上創建注冊服務程序,否則需要指定端口號。
  • 第二個參數為從中調用遠程方法的對象實現引用。
  • RMI 運行時將用對遠程對象 stub 程序的引用代替由 hImpl 參數指定的實際遠程對象引用。遠程實現對象(如 HelloImpl 實例)將始終不離開創建它們的虛擬機。因此,當客戶機在服務器的遠程對象注冊服務程序中執行查找時,將返回包含該實現的 stub 程序的對象。
4.RMI客戶機類

· RMI客戶使用java.rmi.Naming.lookup()方法,在指定的遠程主機上查找RMI服務對象,若找到就把它轉換成本地接口RMIOperate類型。它與CORBA不同之處在于RMI客戶機必須知道提供RMI服務主機的URL,這個URL可以通過rmi://host/path或rmi://host:port/path來指定,如果省略端口號,就默認使用1099。
· Java.rmi.Naming.lookup()方法可能產生三個異常:Java.rmi.RemoteException、Java.rmi.NotBoundException、java.net. MalformedURLException,三個異常都需要捕獲。

HelloClient.java

              
                
                  /*
                
                
                   * @author javamxj (CSDN Blog) 創建日期 2004-12-27
                
                
                   */
                
                
                  import
                
                
                   java
                
                
                  .
                
                
                  rmi
                
                
                  .
                
                
                  *
                
                
                  ;
                
                
                  public
                
                
                  class
                
                 HelloClient {
    
                
                  public
                
                
                  static
                
                
                  void
                
                 main(
                
                  String
                
                [] args) {
        
                
                  //   在服務器端設置安全機制         
                
                
                  /*
                
                
                             if (System.getSecurityManager() == null) {
                
                
                                 System.setSecurityManager(new RMISecurityManager()); 
                
                
                             }
                
                
                          */
                
                
                  /* 默認為本地主機和默認端口 */
                
                
                  String
                
                 host = 
                
                  "localhost:1099"
                
                ;
        
                
                  /* 帶輸入參數時,將host設置為指定主機 */
                
                
                  if
                
                 (args.length > 0)
            host = args[0];
        
                
                  try
                
                 {
            
                
                  /* 根據指定的URL定位遠程實現對象 */
                
                
                  /* “h”是一個標識符,我們將用它指向實現“Hello”接口的遠程對象 */
                
                
            Hello h = (Hello) 
                
                  Naming
                
                .lookup(
                
                  "rmi://"
                
                 + host + 
                
                  "/HelloService"
                
                );
            
            
                
                  System
                
                .out.println(
                
                  "實現“Hello”接口的遠程對象: "
                
                 + h);
            
                
                  System
                
                .out.println(
                
                  "我在客戶端,開始調用RMI服務器端的'sayHello'方法"
                
                );
            
                
                  System
                
                .out.println(
                
                  "歡迎,  "
                
                 + h.sayHello(
                
                  "javamxj blog"
                
                ));
        } 
                
                  catch
                
                 (
                
                  Exception
                
                 ex) {
            
                
                  System
                
                .out.println(
                
                  "錯誤 "
                
                 + ex);
        }
    }
}
              
5. 編譯代碼與運行系統:
在MS-DOS環境下,創建一個D:\RMISample目錄,把上面4個文件復制到這個目錄下,然后在此目錄下新建兩個文件夾:client和server(把它們分別看作是客戶端與服務端)。
(1).編譯所有的源代碼
D:\RMISample> javac *.java

(2).生成客戶端存根和服務器框架
D:\RMISample> rmic HelloImpl
這將生成HelloImpl_Stub.class和HelloImpl_Skel.class。
:如果需要查看這兩個類的源代碼,可以使用“ rmic -keep HelloImpl”語句)
(3).把Hello.class、HelloClient.class、HelloImpl_Stub.class復制到client目錄;
把Hello.class、HelloServer.class、HelloImpl_Skel.class、HelloImpl_Stub.class 復制到server目錄。
(4).啟動RMI注冊
D:\RMISample\server>rmiregistry
(注: 我是在命令控制臺下運行這個系統的,必須開啟三個控制臺窗口,一個運行RMIRegistry,一個運行服務器,還有一個運行客戶端。)
(5).運行和調用

● 在服務器上執行HelloServer
D:\RMISample\server>java HelloServer
● 在本地客戶機上運行HelloClient
D:\RMISample\client>java HelloClient
● 在遠程客戶機上運行HelloClient(須指明RMI服務器主機名或IP地址)
java HelloClient 222.222.34.34
運行rmiregistry和server后的結果:
再運行Client后的結果:
還有一點要注意,在上面的例子中我注釋了安全管理的代碼,如果把注釋去掉,那么需要建立一個安全策略文件,比如其文件名為policy.txt,內容如下:
grant {
permission java.security.AllPermission "", "";
};
這是一條簡單的安全策略,它允許任何人做任何事,對于你的更加關鍵性的應用,你必須指定更加詳細安全策略。把這個文件復制到Client和Server目錄,然后如下運行:
D:\RMISample\server>java -Djava.security.policy=policy.txt HelloServer
D:\RMISample\client>java -Djava.security.policy=policy.txt HelloClient

RMI、CORBA、IIOP簡單實例--1. RMI


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本一区二区高清 | 99久久综合狠狠综合久久一区 | 香蕉网站狼人久久五月亭亭 | 日韩在线视频不卡 | 手机免费看一级片 | 色综合a怡红院怡红院首页 色综合h | 久久不射网站 | 久久狠色噜噜狠狠狠狠97 | 欧美刺激午夜性久久久久久久 | 热九九精品 | 亚洲日本视频在线 | 欧美一级一极性活片免费观看 | 四虎免费永久在线播放 | 日日搞夜夜操 | 国产乱人伦偷精品视频不卡 | 妖精视频在线看免费视频 | 天天艹日日干 | 香蕉网站狼人久久五月亭亭 | 国产精品亚洲综合一区在线观看 | 国产午夜久久精品 | 中文字幕最新中文字幕中文字幕 | 一区亚洲| 久久国产美女免费观看精品 | 久久99精品国产 | 久久午夜青青草原影院 | 久久天天躁狠狠躁夜夜爽 | 国产精品热久久毛片 | 久久精品国产只有精品6 | 国产99青草全福视在线 | 中文国产成人精品少久久 | www.中文字幕.com | 2023中文字幕在线观看 | 久九精品 | 91色多多| 九九久久国产 | 色综合天天综合 | 国产成人免费高清视频 | 久久精品只有这里有 | 在线资源站 | 久久精品国内偷自一区 | 免费一级毛片在线播放欧美 |