Ice是一種面向對象的中間間平台,入門ice,簡單的HelloWorld是必不可少的。
轉載請注明http://www.cnblogs.com/zrtqsk/p/3745286.html,謝謝。
一、寫一個ice定義
ice用來定義接口、程序骨架的,方便遠程調用。首先我們要使用ice專屬的slice語言寫一個ice定義。如下:
file_name:HelloWorld.ice
module myHelloWorld{ interface HelloWorld{ void say(string s); }; };
module相當於java中的包,是ice定義中必不可少的。
二、編譯這個ice定義
要編譯這個ice定義,首先要安裝一個ice服務器,將其中的bin文件夾加入環境變量。跟jdk配置類似。然后使用其中的slice2java命令編譯。
例如HelloWorld.ice文件放在我F盤的test文件夾,運行,就可以在test目錄出現如下文件:
myHelloWorld文件夾名是ice定義中的module名。
三、編寫Servant類
servant類是ice服務器端提供操作調用的行為制品,它提供的是ice對象的實質內容。說白了,就是ice所定義的接口,在服務器端的實現類。
按照管理,servant類名是ice接口名加一個“I”后綴,如下:
package client; import Ice.Current; import myHelloWorld._HelloWorldDisp; public class HelloWorldI extends _HelloWorldDisp{ private static final long serialVersionUID = 1L; @Override public void say(String s, Current __current) { System.out.println("Hello World!"+" the string s is " + s); } }
如上,servant類需要繼承_HelloWorldDisp這個slice2java編譯生成的抽象類。實現方法參數是原本的形參加一個Ice的Current對象。
四、編寫遠程的服務器類
package client; public class Server { public static void main(String[] args) { int status = 0; // Communicator實例,是ice run time的主句柄 Ice.Communicator ic = null; try { // 調用Ice.Util.Initialize()初始化Ice run time System.out.println("初始化ice run time..."); ic = Ice.Util.initialize(args); // 創建一個對象適配器,傳入適配器名字和在10000端口處接收來的請求 System.out.println("創建對象適配器,監聽端口10000..."); Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000"); // 實例化一個PrinterI對象,為Printer接口創建一個servant System.out.println("為接口創建servant..."); Ice.Object object = new HelloWorldI(); // 調用適配器的add,告訴它有一個新的servant,傳遞的參數是剛才的servant,這里的“SimplePrinter”是Servant的名字 System.out.println("對象適配器加入servant..."); adapter.add(object, Ice.Util.stringToIdentity("SimplePrinter")); //調用適配器的activate()方法,激活適配器。被激活后,服務器開始處理來自客戶的請求。 System.out.println("激活適配器,服務器等待處理請求..."); adapter.activate(); //這個方法掛起發出調用的線程,直到服務器實現終止為止。或我們自己發出一個調用關閉。 ic.waitForShutdown(); } catch (Ice.LocalException e) { e.printStackTrace(); status = 1; } catch (Exception e) { e.printStackTrace(); status = 1; } finally { if (ic != null) { ic.destroy(); } } System.exit(status); } }
這個服務器類其實就寥寥幾行代碼,注釋已經很清楚了。
五、編寫客戶端類
package client; import myHelloWorld.HelloWorldPrx; import myHelloWorld.HelloWorldPrxHelper; public class Client { public static void main(String[] args) { int status = 0; // Communicator實例 Ice.Communicator ic = null; try { // 調用Ice.Util.Initialize()初始化Ice run time ic = Ice.Util.initialize(args); // 獲取遠地打印機的代理 Ice.ObjectPrx base = ic.stringToProxy("SimplePrinter:default -p 10000"); // 將上面的代理向下轉換成一個Printer接口的代理 HelloWorldPrx helloWorld = HelloWorldPrxHelper.checkedCast(base); // 如果轉換成功 if (helloWorld == null) { throw new Error("Invalid proxy"); } // 調用這個代理,將字符串傳給它 helloWorld.say("bar"); } catch (Ice.LocalException e) { e.printStackTrace(); status = 1; } catch (Exception e) { e.printStackTrace(); status = 1; } finally { if (ic != null) { ic.destroy(); } } System.exit(status); } }
六、運行
先運行服務器,服務器線程一直運行等待,如下:
初始化ice run time...
創建對象適配器,監聽端口10000...
為接口創建servant...
對象適配器加入servant...
激活適配器,服務器等待處理請求...
運行了客戶端后,顯示如下:
初始化ice run time...
創建對象適配器,監聽端口10000...
為接口創建servant...
對象適配器加入servant...
激活適配器,服務器等待處理請求...
Hello World! the string s is bar
將客戶端改一下 helloWorld.say("foo");,再運行,顯示如下:
初始化ice run time... 創建對象適配器,監聽端口10000... 為接口創建servant... 對象適配器加入servant... 激活適配器,服務器等待處理請求... Hello World! the string s is bar Hello World! the string s is foo
(部分參考《Ice分布式程序設計》)