Java-ICE入門教程(2-2:Java執行個體)__Java
來源:互聯網
上載者:User
1.安裝ICE 下載地址: https://zeroc.com/download.html 需要配置環境變數: classPath添加: %ICE_HOME%/lib/db.jar;%ICE_HOME%/lib/Ice.jar path添加:%ICE_HOME%/bin;
cmd命令: slice2java 出現如下畫面表示安裝成功: .
3.手寫ICE檔案,注意尾碼名為 .ice: message.ice,檔案內容如下:
module message { interface messageDemo{//介面類 int maxNum(int a,int b);//介面方法,參數和傳回值為int }; };
4.產生 JAVA檔案: cmd:slice2java message.ice
5.接下來要寫介面實作類別,需要繼承這麼一個類:_XXXXXXXXDisp: package ice.message.impl; import Ice.Current; import message._messageDemoDisp; public class MessageI extends _messageDemoDisp { @Override public int maxNum(int a, int b, Current __current) { // TODO Auto-generated method stub if(a>b) return a; else if(a<b) return b; else { System.out.println("妹的,他倆居然一樣大。。。"); return 0; } }
}
6.服務端代碼:
package ice.message.server; import ice.message.impl.MessageI; import com.bean.PrinterI; public class IceInit { public static void init() { int status = 0; Ice.Communicator ic = null; try { //初使化串連,args可以傳一些初使化參數,如連線逾時時間,初使化客戶串連池的數量等 ic = Ice.Util.initialize(); //建立名為meaaageDemoAdapter的適配器,並要求適配器使用預設的協議(TCP/IP偵聽連接埠為10000的請求) Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("meaaageDemoAdapter", "default -h 10.0.67.106 -p 10000"); //執行個體化一個MessageI對象,為Message介面建立一個服務物件 Ice.Object object = new MessageI(); //將服務單元增加到適配器中,並給服務物件指定名稱為meaaageDemo,該名稱用於唯一確定一個服務單元 adapter.add(object, Ice.Util.stringToIdentity("meaaageDemo")); //啟用適配器,這樣做的好處是可以等到所有資源就位後再觸發 adapter.activate(); System.out.println("已啟動 meaaageDemoAdapter default -h 10.0.67.106 -p 10000"); //讓服務在退出之前,一直持續對請求的監聽 ic.waitForShutdown(); } catch (Ice.LocalException e) { e.printStackTrace(); status = 1; } catch (Exception e) { System.err.println(e.getMessage()); status = 1; } if (ic != null) { // Clean up // try { ic.destroy(); } catch (Exception e) { System.err.println(e.getMessage()); status = 1; } } System.exit(status); } }
7:用戶端調用代碼:
package ice.message.client; import java.lang.reflect.Method; public class IceClient { public int maxNum(int a,int b) { int status = 0; int resultNum = 0; Ice.Communicator ic = null; try { //初使化 ic = Ice.Util.initialize(); //傳入遠程服務單元的名稱、網路通訊協定、IP及連接埠,擷取Printer的遠程代理,這裡使用的stringToProxy方式 Ice.ObjectPrx objectPrx = ic.stringToProxy("meaaageDemo:default -h 10.0.67.106 -p 10000"); //通過checkedCast向下轉換,擷取Printer介面的遠程,並同時檢測根據傳入的名稱擷取的服務單元是否Printer的代理介面,如 果不是則返回null對象 Method method = objectPrx.getClass().getMethod("maxNum", new Class[] {Integer.class,Integer.class}); resultNum= (Integer) method.invoke(objectPrx, new Object[] {a,b}); } catch (Ice.LocalException e) { e.printStackTrace(); status = 1; } catch (Exception e) { System.err.println(e.getMessage()); status = 1; } if (ic != null) { // Clean up // try { ic.destroy(); } catch (Exception e) { System.err.println(e.getMessage()); status = 1; } } // System.exit(status); return resultNum; } } ****************************藍色字型也可以這麼寫*,但是還是建議第一種方法******************************** message.messageDemoPrx messageDemoPrx = message.messageDemoPrxHelper.checkedCast(base); if (messageDemoPrx == null) throw new Error("Invalid proxy"); //把Hello World傳給服務端,讓服務端列印出來,因為這個方法最終會在服務端上執行 resultNum= messageDemoPrx.m