ZeroC ICE的远程调用框架 class与interface
我们在ice文件中定义的class或interface,slice都会为我们生成stub存根类和skeleton骨架类。在这里要注意slice并没有分别生成两份单独用在客户端或服务端的接口给开发分发。在ice中,client和server只是相对于ice object的使用关系,client即使用代理远程调用ice object的一方,server相对就是为ice object提供执行servant的一方。并非我们传统意义上的c/s结构中的client和server。ice object既可以存在地c/s结构的server端,c/s结构的client端同样也可以提供ice object给server端远程调用。
我们先来看一下,slice对定义的空类和空接口如何生成代码,下面是生成的stub存根类和skeleton骨架类的类图。

上面分别在ice文件定义一个空类"Empty"和一个空接口"I",slice分别为我们在名字空间::IceProxy::Module和Module下都生成了class Empty和class I的类。
不论是类还是接口,对于空的定义目标,slice生成的stub存根类都只是重写(override)了静态方法ice_staticId和成员方法_newInstance。上图左边的两个类Empty和I则是stub存根类。再来看右边生成的skeleton骨架类,slice也几乎做了同样的处理,重写(override)了骨架类最小接口ice_id,ice_ids以及ice_isA,还有跟streaming流化相关两个实现函数_iceReadImpl和_iceWriteImpl。唯一不同的是对于定义为类的Empty,它的skeleton骨架类多了两个成员函数ice_clone和ice_factory。
当我们定义一个类或接口,slice就会最少为我们生成上面类图所示的函数。当我们再定义一对非空的类或接口,我们就可以观察到slice为我们生成了什么,下面的类图隐去上面给出的已知。
首先是定义一个有一个方法的简单接口Intf。

灰色的类是Ice项目内置的类,非slice生成的类。slice为我们针对这个接口的远程调用生成了上面的框架的代码。生成的代码比重偏于Stub存根类(即代理方)的使用(如何应用远程调用)上。Skeleton骨架类重写(override)_iceDispatch分派,开设一个待实现的接口方法函数。
然后是定义一个非空的类NotEmpty,简单地有一个成员,成员类型为我们开篇时定义的Empty。

与上面给出接口生成的类图相比,slice对类的生成框架代码主要集在实体端,并且都是与流化(streaming)相关的设施。而生成的Stub存根类和对Empty(空类)生成的Stub存根类一样,因为它并没有接口方法,可以提供给代理进行远程访问。
从上面可以看到不论类还是接口,在代码映射后都是一个类实体。在slice定义时,我们使用这些类或接口时,都看作一个类实体。而使用这些类或接口的指针时,则看作是它们的代理。我们看下面定义
class B;
interface A {
B b;
B* bprx;
}; class B {
};
A::b会映射成::IceInternal::Handle<B>,而A::bprx会映射成::IceInternal::ProxyHandle<B>。指针被看作是一个对象实体的代理(引用)。
不论是类实体还是代理,都可以进行流化(streamin)在远程调用过程中传递。当传递一个指针,就是在传递相对于某个对象实体的代理。通过代理在ice世界任何一处都可以使用远程调用访问目标的实体。但是传递一个实体而非代理时,就和我们的c++语言在函数中传递对象实体一样,会在传递的目的方进行实体的构造。所以在ice程序中,尽管有一方使用代理进行远程访问为主,但它同样需要依赖slice生成的skeleton骨架类的代码,stub存根类和skeleton骨架类的代码并不分开发给c/s两方的开发者。
下面是以ice代码项目的测试例子项目为例,cpp/test/objects。
slice中定义的类图

slice生成的Skeleton骨架类

ZeroC ICE的远程调用框架 class与interface的更多相关文章
- ZeroC ICE的远程调用框架 Slice如何帮助我们进行Ice异步编程(AMI,AMD)
Slice最大的用处就是为我们使用Ice进行编程,代劳绝大部分的重复性代码,并提供一些帮助性的框架代码,如用于AMI和AMD方式进行异步编程的回调框架. 当Slice不为我们生成代码时,我们仍然可以按 ...
- ZeroC ICE的远程调用框架 AMD
继上一篇<ZeroC ICE的远程调用框架>,本篇再来说其中的AMD.(本篇需要重写) 当在ice文件中声明某个接口方法Method为["amd"]后,接口方法在stu ...
- ZeroC ICE的远程调用框架
想搞清楚slice为我们生成了什么样的框架代码,就先搞明白Ice的远程调用框架暗中为我们做了些什么? Ice将Ice Object的方法调用分为三个阶段(或步骤),分别是begin,process和e ...
- ZeroC ICE的远程调用框架 AMI与AMD -Why?
在Ice有两种异步使用的方式,AMI和AMD.AMI是异步方法调用,AMD是异步方法调度(分派).前者用在代理端,后者用在饲服实现端. AMI其实就是在代理端,使用Future机制进行异步调用,而不阻 ...
- ZeroC ICE的远程调用框架 Callback(一)-AMI异步方法调用框架
Ice框架提供了不少回调设施,其中一些是使用Ice远程调用进行ami模式或amd模式的支撑.本篇来看一下用于代理端的回调设施. Ice代码中有好几个Callback相关命名的基类,并且slice还会为 ...
- ZeroC ICE的远程调用框架 ServantLocator与Locator
ServantLocator定位的目标是Servant,而Locator定位的目标是“Ice Object”,即一个可定位的“Ice Object”代理.Servant是::Ice::Object的继 ...
- ZeroC ICE的远程调用框架 ThreadPool
ThreadPool提供Reactor/Proactor服务,并且强偶合了Reactor(反应器)/Proactor(前摄器).不同于Reactor/Proactor使用线程池 进行事件处理的设计.如 ...
- ZeroC ICE的远程调用框架 代理引用地址
在官方文档中称为Binding,协议-地址对的绑定.在Proxy模式中,一般地有三个参与者,Proxy,Subject以及RealSubject.Subject定义了Proxy(代理)和RealSub ...
- ZeroC ICE的远程调用框架 ASM与defaultServant,ServantLocator
ASM与defaultServant,ServantLocator都是与调用调度(Dispatch)相关的. ASM是ServantManager中的一张二维表_servantMapMap,默认Ser ...
随机推荐
- epoll--IO多路复用
理解 epoll 过程 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...
- i春秋DMZ大型靶场实验(一)内网拓展
更具提示 先下载工具包 ip 172.16.12.226 打开bp 进行代理发现 整个页面 没有请求 没有其页面通过 御剑,dir ,hscan 进行目录爆破未发现有用信息 对当前页面进 ...
- Uipath 浏览器页面最大化和最小化
文章来源东京IT青年前线http://www.rpatokyo.com/ Uipath 浏览器页面最大化和最小化 浏览器在关闭时会自动记忆上次浏览器关闭时窗口的小,下次再次会以同样的大小打开.机器 ...
- 自定义的Spring Boot starter如何设置自动配置注解
本文首发于个人网站: 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触 ...
- Github带来的不止是开源,还有折叠的认知
如果第二次看到我的文章,欢迎右侧扫码订阅我哟~
- markdown语法(转)
markdown语法 1.标题代码 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 2.引用代码 >你好 >> 您好 ...
- (一) kinect概述
Kinect可以进行身体节点定位,姿势定位,人脸识别等功能,在此先做简单介绍,后续主要介绍插件的应用,毕竟自己开发识别过程太消耗时间. (注1:Kinect官方虽然提供了Unity的APi,但是方便起 ...
- SpringBoot系列之@Value和@ConfigurationProperties
继上一篇博客SpringBoot系列之YAML配置用法之后,再写一篇@Value.@ConfigurationProperties的对比博客 这两个主键都是可以获取配置文件属性的,不过是有比较大的区别 ...
- 【MySQL】MySQL Workbench快捷键小结
执行当前行,ctrl+enter 执行整篇sql脚本: ctrl+shift+enter 格式化sql语句(美化sql语句):ctrl+b 自动补全:ctrl+space(似乎win10中这个快捷键失 ...
- 零基础攻略!如何使用kubectl和HPA扩展Kubernetes应用程序
现如今,Kubernetes已经完全改变了软件开发方式.Kubernetes作为一个管理容器化工作负载及服务的开源平台,其拥有可移植.可扩展的特性,并促进了声明式配置和自动化,同时它还证明了自己是管理 ...