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
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!
注意事項:
- 要轉到class檔案所在目錄啟動相應程式;
- 名字伺服器、服務端和客戶端要分別啟動一個DOS命令提示符介面。
- 可採用批處理命令啟動相應程式,分別為:
(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。
最後執行結果如下