Zeroc Ice是指Zeroc公司的ICE(Internet Communications Engine)中间件平台。对于客户端Client和服务端Server程序的开发提供了便利。Ice是一种面向对象的中间件平台,它包括Ice,Ice-E,Ice Touch。Ice支持广泛的语言,包括C++,java,C#,Python,Ruby,PHP和ActionScript,当然也包括所有的Ice服务,如Ice Grid,IceStorm等。
RPC(Remote Procedure Call Protocol)远程过程调用协议
ice实例程序for-java
1:安装配置ice
ICE环境变量配置:
ICE_HOME:C:\Program Files (x86)\ZeroC\Ice-3.5.0(安装的根目录)
Path:%ICE_HOME%\bin
验证是否配置成功:cmd命令输入:slice2cpp 或者slice2cpp -v显示配置的版本。也可以输入slice2java或者slice2java -v显示Ice配置的版本。
2:编写slice定义
cmd输入命令
cd C:\Users\madl\IdeaProjects\IceDemo1\Demo1\src\main\java(进入到Printer.ice文件对应的文件夹下)
slice2java Printer.ice 至此 定义slice和编译已经完成。
批量编译ice文件,可将所有ice文件复制到一个文件夹下,如IDEDemo
cd C:\Users\madl\IdeaProjects\IceDemo
slice2java -I. *.ice 则所有ice文件编译ok
注意:需在工程中加入ice的jar包。
3:编写和编译服务器Server( Server.java是服务端服务代理,用于接收客户端的请求操作)
要实现我们的Printer 接口,我们必须创建一个servant 类。按照惯例,
servant 类的名字是它们的接口的名字加上一个I 后缀,所以我们的servant
类叫作PrinterI,并放在PrinterI.java 源文件中(
PrinterI.java是对服务端实现骨架类_PrinterDisp的实现,返回时将PrinterI.java对象返回给客户端,这里实现的功能是直接输出传入的String参数)
public class PrinterI extends _PrinterDisp {
public void printString(String s, Ice.Current current)
{System.out.println(s);}
}
服务器代码的其余部分在一个叫作Server.java 的源文件中。
public class Server {
public static void main(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
//初使化连接,args可以传一些初使化参数,如连接超时时间,初使化客户连接池的数量等
ic = Ice.Util.initialize(args);
//创建名为SimplePrinterAdapter的适配器,并要求适配器使用缺省的协议(TCP/IP侦听端口为10000的请求)
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");
//实例化一个PrinterI对象,为Printer接口创建一个服务对象
Ice.Object object = new PrinterI();
//将服务单元增加到适配器中,并给服务对象指定名称为SimplePrinter,该名称用于唯一确定一个服务单元
adapter.add(object, Ice.Util.stringToIdentity("SimplePrinter"));
//激活适配器,这样做的好处是可以等到所有资源就位后再触发
adapter.activate();
//让服务在退出之前,一直持续对请求的监听
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);
}
}
4:编写和编译客户Client(Client.java是客户端代码,用于向服务端发起请求,并操作返回的代理对象)
public class Client {
public static void main(String[] args) {
int status = 0;
Ice.Communicator ic = null;
try {
//初始化Ice的runtime
ic = Ice.Util.initialize(args);
//传入远程服务单元的名称、网络协议、IP及端口,获取Printer的远程代理,这里使用的stringToProxy方式
Ice.ObjectPrx base = ic.stringToProxy("SimplePrinter:default -p 10000");
//通过checkedCast向下转换,获取Printer接口的远程,并同时检测根据传入的名称获取的服务单元是否Printer的代理接口,如果不是则返回null对象
Demo.PrinterPrx printer = Demo.PrinterPrxHelper.checkedCast(base);
if (printer == null) throw new Error("Invalid proxy");
//把Hello World传给服务端,让服务端打印出来,因为这个方法最终会在服务端上执行
printer.printString("Hello World!");
} 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);
}
}
5:启动Server,启动Client。
Ice slice rpc框架 hprose
寻址信息 对象标识 可选的facet标识符
找正确的服务器 找服务器中的请求目标 确定是哪个facet
simplePrinter:default -p 10000 串化代理
直接代理
间接代理
直接绑定 间接绑定
servant Ice对象
最多一次 Ice runtime尽可能把请求传递给正确的目的地,也可根据实际情况重新尝试递送失败的请求。
Ice服务
IcePrak 定位服务 用于在使用间接绑定时把符号性的适配器名解析为协议-地址对。
IceBox 协调服务 协调许多应用组件的启动和停止。
IceStorm 发布-订阅服务 解除client和server的耦合。本质上是事件分发交换机
IcePatch 软件修补服务 把软件更新分发给客户
Glacier Ice的防火墙服务 能让客户与服务器通过防火墙安全地进行通信,且又不牺牲安全性。
Slice语言 使 对象接口 和 其实现 相分离的一种机制。
Slice 在客户与服务器之间建立合约,描述应用所使用的各种类型及对象接口。这种描述与实现语言无关。
因为Slice 描述的是接口和类型(不是实现),它是一种纯粹的描述性语言;
你无法用Slice 编写可执行语句。
Slice标识符不能有下划线 转义的标识符\
Ice Objects ice对象响应客户端的请求。
in out
作为out参数的时候 客户端的赋值在服务端是取不到的 但是服务端可以对该参数赋值然后再传递给客户端。
out参数一定是放在所以输入参数的后面,不能交叉使用。
ICE异步
客户AMI形式 服务端AMD(Asynchronous Method Dispatch) synchronous asynchronous
AMI不再显示指定时 slice会生成callback 在客户调用say()同步 begin_say()异步
客户 ["ami" ] AMI_Printer_printString
服务端 ["amd" ]