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的客戶端-服務端建立確實比較麻煩,不過如果之前已經搭建一套框架的話,開發以來也是事半功倍的.