IDE:Eclipse 3.4.1
先在Eclipse建立兩個Java Project
1.然後定義 IDL .
內容如下:
module helloapp { interface Hello { string sayHello(); oneway void shutdown(); };};
**這裡注意, } 後面的 ";"一定要寫上,不然會編譯錯誤
2. 右鍵這個HelloApp.idl檔案
點擊,Change to parent folder in Shell
點擊OK , Eclipse會開啟Shell視圖,是命令列視圖,其實和CMD是一個作用.
這裡我們執行命令 : idlj -fall HellApp.idl
3. 然後我們到項目目錄(H:\DEVELOPING\UMM\workspace\testCorbaServer\src\server)下就能看到多產生了一個檔案夾 -- helloapp
開啟裡面試一些java介面類
4.在服務端建立一個package 名字跟 idl內容裡的module相同,這裡我們是 ' helloapp '
然後把類複製到這個包下面
---------------------------------------
---------------------------------------
第二部分 實現IDL產生的類的介面
1.實現服務端
內容如下:
package server;import org.omg.CORBA.ORB;import helloapp.HelloPOA;public class HelloImpl extends HelloPOA { private ORB orb; public void setOrb(ORB orb) { this.orb = orb; } @Override public String sayHello() { return "\nHello World!!\n"; } @Override public void shutdown() { orb.shutdown(false); }}
以上,服務端的"服務"就寫好了, 下面還要在服務端寫一個入口類,把你的服務"註冊"上.
內容如下:
package server;import helloapp.Hello;import helloapp.HelloHelper;import org.omg.CORBA.ORB;import org.omg.CORBA.ORBPackage.InvalidName;import org.omg.CosNaming.NameComponent;import org.omg.CosNaming.NamingContextExt;import org.omg.CosNaming.NamingContextExtHelper;import org.omg.CosNaming.NamingContextPackage.CannotProceed;import org.omg.CosNaming.NamingContextPackage.NotFound;import org.omg.PortableServer.POA;import org.omg.PortableServer.POAHelper;import org.omg.PortableServer.POAManagerPackage.AdapterInactive;import org.omg.PortableServer.POAPackage.ServantNotActive;import org.omg.PortableServer.POAPackage.WrongPolicy;public class Main { public static void main(String[] args) { try { // 建立一個ORB執行個體 ORB orb = ORB.init(args, null); // 得到一個RootPOA的引用,並啟用POAManager POA rootpoa = POAHelper.narrow(orb .resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); // create servant and register it with ORB // 建立一個HelloImpl執行個體(servant),並註冊到ORB上 HelloImpl helloImpl = new HelloImpl(); helloImpl.setOrb(orb); // 在服務中得到對象的引用 org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref); //得到一個根名稱的上下文 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); // Use NamingContextExt which is part of the Interoperable // Naming Service (INS) specification. NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // 在命名內容中綁定這個對象 String name = "Hello"; NameComponent path[] = ncRef.to_name(name); ncRef.rebind(path, href); System.out.println("HelloServer ready and waiting ..."); //啟動線程服務,等待用戶端的調用 orb.run(); } catch (InvalidName e) { e.printStackTrace(); } catch (AdapterInactive e) { e.printStackTrace(); } catch (ServantNotActive e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (WrongPolicy e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NotFound e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (CannotProceed e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("HelloServer Exiting ..."); }}
注意 :這裡雖然是入口,可是不能直接右鍵run as - > Java Application
---------------------------------------
---------------------------------------
實現用戶端
1.要把服務端產生的工具類複製到用戶端(最好包結構一致)
2.編寫用戶端調用.
內容如下:
package client;import helloapp.Hello;import helloapp.HelloHelper;import org.omg.CORBA.ORB;import org.omg.CosNaming.NamingContextExt;import org.omg.CosNaming.NamingContextExtHelper;public class HelloClient { static Hello helloImpl; public static void main(String[] args) { try { // 建立一個ORB執行個體 ORB orb = ORB.init(args, null); // 擷取根名稱上下文 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); // Use NamingContextExt instead of NamingContext. This is // part of the Interoperable naming Service. NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // 從上下文中擷取介面實現對象 String name = "Hello"; helloImpl = HelloHelper.narrow(ncRef.resolve_str(name)); System.out.println(helloImpl.sayHello()); System.out.println("asdfasdfdasf"); } catch (Exception e) { e.printStackTrace(); } }}
這樣 用戶端就完成調用了. 下面就是如何 運行起來了.
1. 運行CORBA服務 (直接CMD運行即可)
orbd -ORBInitialPort 1053 -ORBInitialHost 192.168.1.42
注: 192.168.1.42是我自己的本地IP地址 1053是連接埠
CORBA服務獨立於用戶端和服務端,相當於一條橋樑.
這個視窗不要關掉,游標會一直閃.
2.啟動服務端
啟動服務端需要main函數傳遞參數,所以我們要先配一些main函數的參數. :
點開:
Main就是我們服務端的入口函數. 之前有說過.
然後在arguments的program arguments: 寫入
-ORBInitialPort 1053
連接埠1053是與之前的CORBA服務的連接埠對應的
服務端就配好了. 運行服務端.
不要關閉服務端.
3.啟動用戶端
這裡我不用多說了,然後啟動運行,就可以看到運行結果了.
說明: 依照原文,可能環境不同會出些奇怪的問題,希望讀者先仔細檢查是否和原文有出入,或者檢查異常,還是不行的話,歡迎留言一起討論.
CORBA的用戶端-服務端建立確實比較麻煩,不過如果之前已經搭建一套架構的話,開發以來也是事半功倍的.