一. 准备工作
1.下载ice3.6
官网下载地址
下载后点击安装
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
来生成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,伺服者. 是具体实现接口方法的类,通常命名是接口名+I
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,结果: