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" ]

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值