ice是跨平台,跨語言服務端調用的解決方案
一.下載ice3.6
http://download.zeroc.com/Ice/3.6/Ice-3.6.4.msi
二.配置環境變量
ICE_HOME= D:\project\ZeroC\Ice-3.6.4
Path= %ICE_HOME%\bin;
cmd打開dos窗口查看是否安裝成功: slice2java -v
三.idea創建ice文件
pom.xml
<dependency> <groupId>com.zeroc</groupId> <artifactId>ice</artifactId> <version>3.6.3</version> </dependency>
先創建slice文件夾然后創建包路徑最后創建Hello.ice
如果不能創建ice文件可以先創建file文件以.ice結尾,idea會提示下載ice插件,然后重啟就行了
Hello.ice:
[["java:package:com.test.ice.service"]] // 定義java包名 父結構 module demo //模塊包名 { interface Hello //接口服務名稱 { string sayHello(string s); //具體的方法 }; };
四.使用slice2java編譯ice文件生成java代碼
打開cmd窗口進入Hello.ice目錄下執行:
slice2java .\Hello.ice --output-dir ..\src\main\java
執行成功之后會在java目錄下生成10個java文件
五.編寫程序 HelloI Client Server
public class HelloI extends _HelloDisp { private static final long serialVersionUID = -3966457693815687559L; private Logger log = Logger.getLogger(this.getClass().getSimpleName()); public String sayHello(String s, Current __current) { log.info("具體的服務接口實現類中的sayHello方法被調用了。。。"); return "Hello " + s; } }
public class Client { private static Logger log = Logger.getLogger(Client.class.getSimpleName()); public static void main(String[] args) { log.info("客戶端啟動..."); // 通信器 Communicator ic = null; // 初始化這個通信器 ic = Util.initialize(args); // 根據地址生成一個服務代理對象 // HelloIce -- 服務端那邊自己定義的名字 ObjectPrx proxy = ic.stringToProxy("HelloIce:default -p 1888"); // 轉換成HelloService類型的代理服務 HelloPrx hello = HelloPrxHelper.checkedCast(proxy); //調用方法 String s = hello.sayHello("World!"); System.out.println(">>"+s); } }
public class Server { private static Logger log = Logger.getLogger(Server.class.getSimpleName()); public static void main(String[] args) { // 通信器 Communicator ic = null; // 初始化這個通信器 ic = Util.initialize(args); // 創建ice適配器,將服務調用地址和服務映射起來 // "HelloServiceAdapter"是適配器名, "default -p 1888"是服務調用的地址 ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("HelloServiceAdapter","default -p 1888"); // 將服務的具體實現類servant交給這個適配器 Object servant = new HelloI(); // "HelloIce"--服務接口在ice中注冊名,轉成唯一標識identity Identity id = Util.stringToIdentity("HelloIce"); adapter.add((Ice.Object) servant, id); // 激活這個適配器 adapter.activate(); log.info("server服務容器啟動成功。。。"); } }
六.啟動程序
先啟動server
再啟動client
以上的代碼是同一台電腦之間調用,如果需要跨服務器之間調用,或者無論其他什么語言的客戶端調用,只需要獲取遠程服務代理的時候加上ip即可。default默認采取tcp協議,所以下邊的代碼其實等同於上邊我們調用本地機器的代碼。
Ice.ObjectPrx base = ic.stringToProxy("HelloIce:tcp -h 127.0.0.1 -p 10000");
一個簡單的java開發ice案例完成
server:

public static void main(String[] args) { int status = 0; // Communicator實例,是ice run time的主句柄 Communicator ic = null; try { // 調用Ice.Util.Initialize()初始化Ice run time System.out.println("初始化ice run time..."); //args參數可傳可不傳 ic = Util.initialize(args); // 創建一個對象適配器,傳入適配器名字和在10000端口處接收來的請求 System.out.println("創建對象適配器,監聽端口10000..."); ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000"); // 實例化一個PrinterI對象,為Printer接口創建一個servant System.out.println("為接口創建servant..."); Object servant = new HelloI(); // 調用適配器的add,告訴它有一個新的servant,傳遞的參數是剛才的servant,這里的“SimplePrinter”是Servant的名字 System.out.println("對象適配器加入servant..."); adapter.add((Ice.Object) servant, 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); }
Client:

public static void main(String[] args) { int status = 0; // Communicator實例 Communicator ic = null; try { // 調用Ice.Util.Initialize()初始化Ice run time ic = Util.initialize(args); // 根據servant的名稱以及服務器ip、端口獲取遠程服務代理 ObjectPrx base = ic.stringToProxy("SimplePrinter:default -p 10000"); // 將上面的代理向下轉換成一個Printer接口的代理 HelloPrx hello = HelloPrxHelper.checkedCast(base); // 如果轉換成功 if (hello == null) { throw new Error("Invalid proxy"); } // 調用這個代理,將字符串傳給它 String s = hello.sayHello("World!"); System.out.println(s+"<<"); } catch (Ice.LocalException e) { e.printStackTrace(); status = 1; } catch (Exception e) { e.printStackTrace(); status = 1; } finally { if (ic != null) { ic.destroy(); } } System.exit(status); }