ICE是网络通信引擎缩写,前几个项目中有用到,用起来方便顺手。
想到读书时学习毛主席写的《星星之火可以燎原》,其中这句写的非常好:"我们看事情必须要看它的实质,而把它的现象只看作入门的向导,一进了门就要抓住它的实质,这才是可靠的科学的分析方法。"。老人家确实厉害。想想我们从事软件研发的,也会遇到各种技术框架,还没开始用就想着去读源码,还是有点不科学了,反省我们这个行业还是要戒骄戒躁,能够踏踏实实的才好。不然总有动嘴的比动手的看起来混的好。(关于动嘴的不是贬义,在什么是领导的思考的博客中会有说明。)
继续回到ICE使用上来,这里先拉个远程打印的例子,网上关于ICE最普遍的例子,我这里做写小改动。
#ifndef PRINTER_TEST_H
#define PRINTER_TEST_H
module com{
module xue{
module gang{
module print{
interface Printer{
void print(string mesg);
};
};
};
};
};
#endif
只定义了一个print方法。
用slice2Java命令映射成Java文件
黄色为接口,紫色为类;生成了很多文件,但我们需要关心的只有:
服务端生成类:
客户端生成类:
>1>在服务端实现: _PrinterDisp 文件, *Disp 文件
>2>客户端的: PrinterPrx 文件, *Prx文件,并不是严格划分,如传引用是*prx文件也在服务端构建。
实现_PrinterDisp 中print未实现的方法
package com.jd.jcloud.op.printer.server;
import Ice.Current;
import com.xue.gang.print._PrinterDisp;
public class PrinterImpl extends _PrinterDisp {
@Override
public void print(String mesg, Current __current) {
System.out.println(mesg);
}
}
可以发现Servant是一个一个的实现逻辑模块。
怎么把Servant模块,装入ICE框架,客户端请求后,能够定位到,并调用相应的方法。如代码所示:
1.创建Communicator对象
2.通过Communicator对象获取adapter容器
3.实例化Servant对象(PrinterImpl)
4.把Servent对象加入adapter容器中,并且唯一一个键值
5.激活adapter容器中的对象
6.Communicator服务直到关闭
参见:附件1 远程打印服务端代码
客户端根据参数创建到服务端的连接,并与客户端确认找到对应的Servant。
>1>checkedCast 方法 与服务端交互,检查是否返回对应的类型,如果不是返回uull;
>2>uncheckedCast方法不与服务端交互,直接返回;
看起来这两个方法有路由的功能(待确认..)
1.创建Communicator连接
2.通过IP &Port等参数获取到ObjectPrx对象
3.调用checkedCast方法和服务器确认ObjectPrx是否是希望的类型。
4.如果类型正确,调用服务器上Servant的实现方法。
参见:附件2 远程打印客户端代码