一. 準備工作
1.下載ice3.6
官網下載地址 http://download.zeroc.com/Ice/3.6/Ice-3.6.4.msi
下載後點擊安裝即可
2. 配置環境
想必大家如果要用到ice,配置環境都是小菜一碟了,這裏也就不多贅述,網上百度一堆.
ICE_HOME= C:\ZeroC\Ice-3.6.4
Path= %ICE_HOME%\bin;
cmd命令輸入slice2java -v ,如果顯示3.6.4代表配置ok
3. 編譯插件slice2java
ICE因爲支持多種語言之間的服務調用,所以它有一個後綴爲.ice的文件,類似java的.java,通過slice2java編譯生成相應的java文件,我們可以直接去.ice的目錄下,通過cmd命令行
slice2java XXX.ice
1
來生成java文件, 我們也可以使用eclipse的插件.
eclipse – Help – Marketplace 搜索ice,第一個插件install
安裝重啓.
二. 開始編寫程序
1. 建一個java工程
需要導入jar包:
ice-3.6.4.jar, build path , 這個jar包在ICE安裝文件夾的lib文件夾中可以找到
2. 建一個slice文件夾,建Hello.ice
[["java:package:com.zgd.ice"]] //父包結構
module service{ //包名 具體生成的包爲: 父包結構 + 包名
interface HelloService{ //接口名 不能用Ice作爲接口名的開頭
string sayHello(string s); //類型都是小寫開頭,常用的有string,int,long
};
};
注意事項: 不能用Ice作爲接口名的開頭
ice的註釋跟c++一樣
右單擊工程ice_hello->Ice Builder->Add Ice Builder ,如果沒有錯誤將會自動生成generated文件夾及內容,如下圖所示:
3. 服務者
3.1 寫一個服務接口的實現類,也叫servant,伺服者. 是具體實現接口方法的類,通常命名是接口名+Impl
package com.zgd.ice.service.impl;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.zgd.ice.service._HelloServiceDisp;
import Ice.Current;
/**
* @author Admin
* 服務接口的具體實現類---servant伺服者
*/
public class HelloI extends _HelloServiceDisp {
private Logger log = Logger.getLogger(this.getClass().getSimpleName());
/**
* 實現具體的服務接口中的方法
* @param str
* @param __current
* @return
*/
@Override
public String sayHello(String str, Current __current) {
log.info("具體的服務接口實現類中的sayHello方法被調用了。。。");
return "Hello world :"+str;
}
}
3.2 寫一個服務啓動容器類
package com.zgd.ice.service.impl;
import java.util.logging.Level;
import java.util.logging.Logger;
import Ice.Communicator;
import Ice.Identity;
import Ice.Object;
import Ice.ObjectAdapter;
import Ice.Util;
/**
* @author Admin
*
* servant 服務啓動容器
*/
public class HelloServer {
private static Logger log = Logger.getLogger(HelloServer.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(servant, id);
// 激活這個適配器
adapter.activate();
log.info("server服務容器啓動成功。。。");
}
}
到這服務者這一方就已經搞定了, 可以看到是通過Communicator通信器創建了ObjectAdapter適配器,適配器來管理服務接口名 , 以及調用地址. 在客戶端這邊也同樣是通過這個適配器來找到對應的調用地址
4. 客戶端
另外建一個工程client
同樣導入ice-3.6.4.jar
拷貝slice文件夾, 同樣通過slice2java生成java類 , 感覺有點類似webService的使用方式,兩邊都生成接口文件
4.1 寫一個客戶端類
/**
*
*/
package com.zgd.ice.client;
import java.util.logging.Logger;
import com.zgd.ice.service.HelloServicePrx;
import com.zgd.ice.service.HelloServicePrxHelper;
import Ice.Communicator;
import Ice.ObjectPrx;
import Ice.Util;
/**
* @author Admin 客戶端
*/
public class HelloClient {
private static Logger log = Logger.getLogger(HelloClient.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類型的代理服務
HelloServicePrx helloServicePrx = HelloServicePrxHelper.checkedCast(proxy);
//調用方法
String str = helloServicePrx.sayHello("zgd");
System.out.println(str);
}
}
先運行服務端的main, 再運行client的main,結果: