1. 程式人生 > >第一個corba 程式 實現客戶端伺服器通訊 JACORB

第一個corba 程式 實現客戶端伺服器通訊 JACORB

JacORB的應用開發一般分為以下五步:

1.寫IDL介面定義編譯IDL

2.介面定義生成Java類

3.實現步驟2中生成的介面

4.寫伺服器啟動類,並註冊到ORB

5.寫客戶端去獲取服務物件引用

2) 在系統環境變數中設定

classpath=.;C:\JacORB\lib\idl.jar;

C:\JacORB\lib\jacorb.jar;

C:\JacORB\lib\classes;
另外,為了方便使用ant和命令列工具,在path中加入C:\JacORB\bin

3) 接著,把C:\JacORB\etc目錄下的jacorb_properties.template複製到C:\JacORB\classes目錄下,並更名為jacorb.properties

4) 配置命名服務, 編輯jacorb.properties檔案

設定其中的 ORBInitRef.NameService=file:/ D:/JacORB/NS_Ref,這個NS_Ref檔案會在啟動命名服務時生成.該配置檔案其餘部分保留預設值即可.
測試命名服務(NS,Naming Service)是否可以正常啟動
1) 在C:\JacORB\bin目錄下找到檔案jac.bat.tpl,更名為jac.bat

2) 在dos視窗下輸入 ns NS_Ref
如果出現下面的輸出說明已經正常啟動這裡寫圖片描述
要體現CORBA技術的運作,就從這個helloworld級的CORBA開始,用Java寫

  1. 介面定義 (Hello.idl)
    Hello.idl
    module HelloApp
    {
    interface Hello
    {
    string sayHello(in string message);
    };
    };

裝了Java就自帶了工具idlj(jdk1.3.0_01以上版本,之前版本的是idltojava或idl2java),為介面定義檔案生成客戶端存根和伺服器框架。具體操作如下:
idlj -oldImplBase -fall Hello.idl

編譯後將在 HelloApp 子目錄中形成以下六個檔案:
●_HelloImplBase.java
該抽象類是一個伺服器 skeleton,它可為伺服器提供基本的 CORBA 功能。它實現 Hello.java 介面。伺服器類 HelloServant 擴充套件 _HelloImplBase。
● _HelloStub.java
該類是客戶機 stub,可為客戶機提供 CORBA 功能。它實現 Hello.java 介面。

●Hello.java
該介面含有 IDL 介面的 Java 版本。Hello.java 介面擴充套件 org.omg.CORBA.Object 並提供標準的 CORBA 物件功能。

●HelloHelper.java
這是一個終態類,可以提供輔助功能,特別是提供將 CORBA 物件引用轉換為適當型別所需的 narrow() 方法。

●HelloHolder.java
這是一個終態類,其中含有 Hello 型別的公有例項成員。它可為“out” 和 “inout” 變數提供操作。CORBA 有這些變數,但不容易對映為 Java 的語義。
●HelloOperations.java
這是一個介面類,其中含有方法 sayHello()。

要完成該應用程式,只需在檔案 HelloServer.java 和 HelloClient.java 中提供伺服器和客戶機的實現即可。

  1. 介面實現(HelloImpl.java)
    HelloImpl.java是Hello IDL 介面的實現;每個Hello例項都由一個HelloImpl例項來實現。HelloImpl是_HelloImplBase的子類,_HelloImplBase是由 idlj編譯器從示例 IDL 中生成的。

import HelloApp.*;
public class HelloImpl extends _HelloImplBase {
/* 建構函式 */
public HelloImpl() {
super();
}
/* 實現介面宣告方法sayHello */
public String sayHello(String message) {
System.out.println(“我在CORBA的伺服器端,客戶端正在呼叫’sayHello’方法。 “);
System.out.println(“Hello ” + message);
return message;
}
}

  1. 伺服器端程式(HelloServer.java)
    import org.omg.CosNaming.*;
    import org.omg.CORBA.*;
    public class HelloServer {
    public static void main(String args[]) {
    try {
    /* 建立和初始化 ORB */
    ORB orb = ORB.init(args, null);
    System.out.println(“開始 ORB Server …”);
    /* 建立一個例項並將其向 ORB 註冊 */
    HelloImpl helloImpl = new HelloImpl();
    orb.connect(helloImpl);
    System.out.println(“將例項註冊到ORB “);
    /* 獲取根命名上下文 */
    org.omg.CORBA.Object objRef =orb.resolve_initial_references(“NameService”);
    NamingContext ncRef = NamingContextHelper.narrow(objRef);
    /* 繫結命名中的物件引用 */
    NameComponent nc = new NameComponent(“Hello”, “”);
    NameComponent path[] = { nc };
    ncRef.rebind(path, helloImpl);
    /* 等待來自客戶機的呼叫 */
    java.lang.Object sync = new java.lang.Object();
    synchronized (sync) {
    sync.wait();
    }
    System.out.println(“等待CORBA客戶端呼叫…”);
    } catch (Exception e) {
    System.err.println(“錯誤: ” + e);
    e.printStackTrace(System.out);
    }
    }
    }

  2. 客戶端程式(HelloClient.java)
    import HelloApp.*;
    import org.omg.CosNaming.*;
    import org.omg.CORBA.*;
    public class HelloClient {
    public static void main(String args[]) {
    try {
    /* 建立和初始化 ORB */
    ORB orb = ORB.init(args, null);
    /* 獲取根命名上下文 */
    org.omg.CORBA.Object objRef = orb.resolve_initial_references(“NameService”);
    NamingContext ncRef = NamingContextHelper.narrow(objRef);
    /* 解析命名中的物件引用 */
    NameComponent nc = new NameComponent(“Hello”, “”);
    NameComponent path[] = { nc };
    Hello h = HelloHelper.narrow(ncRef.resolve(path));
    /* 呼叫 Hello 伺服器物件並列印結果 */
    System.out.println(“我在客戶端,開始呼叫CORBA伺服器端的’sayHello’方法”);
    System.out.println(“歡迎, ” + h.sayHello(“javamxj blog”));
    } catch (Exception e) {
    System.out.println(“錯誤 : ” + e);
    e.printStackTrace(System.out);
    }
    }
    }

CORBA Server/Client的編譯與執行

· 把上面4個檔案複製到D:\CorbaSample目錄下,在此目錄下建立Client和Server目錄,假設它們分別為客戶端和服務端。

· 編譯Hello.idl
D:\CorbaSample>idlj -oldImplBase -fall Hello.idl
這會生成一個HelloApp的目錄

· 編譯所有java檔案:
D:\CorbaSample>javac .java HelloApp/.java

· 分別在Client和Server目錄下建立HelloApp子目錄,將D:\CorbaSample\HelloApp目錄中的
_HelloStub.class
Hello.class
HelloHelper.class
HelloHolder.class
HelloOperations.class
複製到D:\CorbaSample\Client\HelloApp目錄下,再將D:\CorbaSample目錄中的HelloClient.class複製到D:\CorbaSample\Client目錄下。

將D:\CorbaSample\HelloApp目錄中的
_HelloImplBase.class
Hello.class
HelloOperations.class
複製到D:\CorbaSample\Server\HelloApp目錄下,再將D:\CorbaSample目錄中的HelloServer.class和 HelloImpl.class 複製到D:\CorbaSample\Server目錄中
(注意:當然,你可以不必建立Server和Client目錄及以上覆制檔案的操作,可以直接在D:\CorbaSample目錄中進行操作,我這樣做的目的主要是為了區分客戶端和服務端)

· 確保名字伺服器處於執行狀態:
D:\CorbaSample\Server>tnameserv -ORBInitialPort 1050

· 在另一個DOS視窗啟動 Hello 伺服器:
D:\CorbaSample\Server>java HelloServer -ORBInitialPort 1050

· 又再在另一個DOS視窗啟動CORBA客戶端呼叫CORBA服務:
D:\CorbaSample\Client>java HelloClient -ORBInitialPort 1050
(本地呼叫,不需要用-ORBInitialHost引數來指定遠端的IP地址)

D:\CorbaSample\Server>java HelloClient -ORBInitialHost localhost -ORBInitialPort 1050
(遠端呼叫CORBA服務,可以將localhost替換成遠端的IP地址)