1. 程式人生 > >JAVA版CORBA程式——HelloWorld

JAVA版CORBA程式——HelloWorld

實現詳解:

1 編寫IDL介面HelloWorld.idl

module sample{

interface HelloWorld{

string sayHello();   

};  

};

說明:CORBA處理字串有:String和wstring兩種型別,string型別主要用於處理ASCII型別的字串,wstring用於處理多位元組的字串,例如:中文

2編譯IDL介面:X:\corba>idlj –fall HelloWorld.idl

編譯結果生成sample包,生成下述檔案

_HelloWorldStub.java

HelloWorld.java

HelloWorldHelper.java

HelloWorldHolder.java

HelloWorldOperations.java

HelloWorldPOA.java

3 編寫並編譯服務端程式:HelloWorldServer.java

import sample.*;

import org.omg.CosNaming.*;

import org.omg.CosNaming.NamingContextPackage.*;

import org.omg.CORBA.*;

import org.omg.CORBA.portable.*;

import org.omg.PortableServer.*;

class

HelloWorldServant extends HelloWorldPOA{   //物件實現類

public String sayHello(){

return "\nHello World!\n";

}

}

public class HelloWorldServer{                  //服務程式

public static void main(String args[]){

try{

//初始化ORB

ORB orb = ORB.init(args, null);

//取根POA的引用

org.omg.CORBA.Object poaobj = orb.resolve_initial_references ("RootPOA");

org.omg.PortableServer.POA rootPOA = org.omg.PortableServer.POAHelper.narrow(poaobj);

org.omg.PortableServer.POAManager manager = rootPOA.the_POAManager();

//建立伺服物件 

HelloWorldServant objRef = new HelloWorldServant();

HelloWorld obj = objRef._this(orb);

//繫結命名服務 

NamingContext ncRef = NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));

NameComponent nc = new NameComponent("Hello", "");

NameComponent path[] = {nc};

ncRef.rebind(path, obj);

//啟用POA管理器 

manager.activate();

//等待處理客戶程式的請求

System.out.println("HelloWorld is running!");

orb.run();

}catch (Exception e) {

System.err.println("ERROR: " + e);

e.printStackTrace(System.out);

}

}

}

4 編寫並編譯客戶端程式: HelloWorldClient.java

import sample.*;

import org.omg.CosNaming.*;

import org.omg.CORBA.*;

public class HelloWorldClient {

public static void main(String args[]) {

try{

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};

HelloWorld helloWorld = HelloWorldHelper.narrow(ncRef.resolve(path));

String hello = helloWorld.sayHello();

System.out.println(hello);

} catch (Exception e) {

System.out.println("ERROR : " + e) ;

e.printStackTrace(System.out);

}

}

}

5執行

啟動名字伺服器:X:\corba >tnameserv -ORBInitialPort 1050

啟動服務端程式:X:\corba >java HelloWorldServer -ORBInitialPort 1050

輸出:HelloWorld is running

啟動客戶端程式:X:\corba >java HelloWorldClient -ORBInitialPort 1050

輸出:Hello World!

注意事項:

  1. 要轉到class檔案所在目錄啟動相應程式;
  2. 名字伺服器、服務端和客戶端要分別啟動一個DOS命令提示符介面。
  3. 可採用批處理命令啟動相應程式,分別為:

(1)啟動名字伺服器:

tnameserv -ORBInitialPort 1050

@pause

(2)啟動伺服器端程式:

java HelloWorldServer -ORBInitialPort 1050

@pause

(3)啟動客戶端程式:

java HelloWorldClient -ORBInitialPort 1050

@pause

要求編寫實現顯示“Hello,World!+班級+中文姓名”字串。

具體步驟

        因為最後要在客戶端輸出Hello World +班級+姓名,string型別主要用於處理ASCII型別的字串,wstring用於處理多位元組的字串班級和姓名含中文,如果在IDL檔案中直接用string的話,後面在客戶端是不會顯示班級和姓名的。所以在將IDL中的string改為wstring然後在編譯這個介面就好了。

首先在cmd中進入idl檔案所在處,用命令:idlj –fall HelloWorld.idl編譯idl介面。同級目錄中會產生一個sample包,將這個包拖入eclipse。

然後將作業包中已經給出的程式碼新增到對應的類中。

在dos中進入到檔案所在地,執行tnameserv -ORBInitialPort 1050命令,1050是埠號。

在客戶端HelloWorldClient中將輸出改為Hello World +班級+姓名

右擊客戶端HelloWordClient.java選擇run as,選擇run configruations,在裡面配置埠號。完成後點選run。

最後執行結果如下