ICE使用【1】远程打印

ICE是网络通信引擎缩写,前几个项目中有用到,用起来方便顺手。

想到读书时学习毛主席写的《星星之火可以燎原》,其中这句写的非常好:"我们看事情必须要看它的实质,而把它的现象只看作入门的向导,一进了门就要抓住它的实质,这才是可靠的科学的分析方法。"。老人家确实厉害。想想我们从事软件研发的,也会遇到各种技术框架,还没开始用就想着去读源码,还是有点不科学了,反省我们这个行业还是要戒骄戒躁,能够踏踏实实的才好。不然总有动嘴的比动手的看起来混的好。(关于动嘴的不是贬义,在什么是领导的思考的博客中会有说明。)

继续回到ICE使用上来,这里先拉个远程打印的例子,网上关于ICE最普遍的例子,我这里做写小改动。


1.1 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方法。


1.2 映射Java文件

 用slice2Java命令映射成Java文件


黄色为接口,紫色为类;生成了很多文件,但我们需要关心的只有:


服务端生成类:

ICE使用【1】远程打印


客户端生成类:

ICE使用【1】远程打印


>1>在服务端实现: _PrinterDisp  文件, *Disp 文件

>2>客户端的: PrinterPrx 文件, *Prx文件,并不是严格划分,如传引用是*prx文件也在服务端构建。


1.3 实现服务端的Servant 代码

实现_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是一个一个的实现逻辑模块。


1.4 实现服务器端


怎么把Servant模块,装入ICE框架,客户端请求后,能够定位到,并调用相应的方法。如代码所示:


ICE使用【1】远程打印

1.创建Communicator对象


2.通过Communicator对象获取adapter容器


3.实例化Servant对象(PrinterImpl


4.Servent对象加入adapter容器中,并且唯一一个键值


5.激活adapter容器中的对象


6.Communicator服务直到关闭

参见:附件远程打印服务端代码

1.5实现客户端

客户端根据参数创建到服务端的连接,并与客户端确认找到对应的Servant

>1>checkedCast 方法 与服务端交互,检查是否返回对应的类型,如果不是返回uull;

>2>uncheckedCast方法不与服务端交互,直接返回;

看起来这两个方法有路由的功能(待确认..


ICE使用【1】远程打印

1.创建Communicator连接


2.通过IP &Port等参数获取到ObjectPrx对象


3.调用checkedCast方法和服务器确认ObjectPrx是否是希望的类型。


4.如果类型正确,调用服务器上Servant的实现方法。


参见:附件远程打印客户端代码 

1.6 抽象图


ICE使用【1】远程打印

你可能感兴趣的:(java,ICE)