ICE是网络通讯引擎缩写,前几个项目中有用到,用起来方便顺手。 服务器
想到读书时学习毛主席写的《星星之火能够燎原》,其中这句写的很是好:"咱们看事情必需要看它的实质,而把它的现象只看做入门的向导,一进了门就要抓住它的实质,这才是可靠的科学的分析方法。"。老人家确实厉害。想一想咱们从事软件研发的,也会遇到各类技术框架,还没开始用就想着去读源码,仍是有点不科学了,检讨咱们这个行业仍是要戒骄戒躁,可以踏踏实实的才好。否则总有动嘴的比动手的看起来混的好。(关于动嘴的不是贬义,在什么是领导的思考的博客中会有说明。) 网络
继续回到ICE使用上来,这里先拉个远程打印的例子,网上关于ICE最广泛的例子,我这里作写小改动。 框架
#ifndef PRINTER_TEST_H ide
#define PRINTER_TEST_H 学习
module com{ spa
module xue{ .net
module gang{ server
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服务直到关闭
客户端根据参数建立到服务端的链接,并与客户端确认找到对应的Servant。
>1>checkedCast 方法 与服务端交互,检查是否返回对应的类型,若是不是返回uull;
>2>uncheckedCast方法不与服务端交互,直接返回;
看起来这两个方法有路由的功能(待确认..)
1.建立Communicator链接
2.经过IP &Port等参数获取到ObjectPrx对象
3.调用checkedCast方法和服务器确认ObjectPrx是不是但愿的类型。
4.若是类型正确,调用服务器上Servant的实现方法。