Ice的基础使用(一)

来源:互联网 发布:内裤淘宝主图设计 编辑:程序博客网 时间:2024/05/16 15:12

       最近在学习使用Ice分布式程序设计,现将所学整理如下: 

       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" ]
0 0
原创粉丝点击