客户与服务器都由这样一些代码混合而成:应用代码、库代码、根据
Slice 定义生成的代码:
• Ice 核心为远地通信提供了客户端和服务器端运行时支持。其中的大量代
码所涉及的是网络通信、线程、字节序,以及其他许多与网络有关的问
题,我们想要让应用代码与这些问题隔离开来。Ice 核心是作为客户和
服务器可与之链接的库提供的。
• Ice 核心的通用部分 (也就是说,与你用Slice 定义的特定类型 无关的部
分) 可通过Ice API 访问。你用Ice API 来照管各种管理事务,比如Ice
run time 的初始化和结束。用于客户和服务器的Ice API 是一样的 (尽
管服务器使用的API 比客户要多)。
• 代理代码是根据你的Slice 定义生成的,因此,与你用Slice 定义的对象和
数据的类型是对应的。代理代码有两个主要功能:
• 它为客户提供了一个向下调用(down-call)接口。如果你调用“生
成的代理API”中的某个函数,就会有一个RPC 消息被发给服务器,
调用目标对象上的某个对应的函数。
• 它提供了整编(marshaling)和解编(unmarshaling)代码。
整编是使复杂的数据结构(比如序列或词典)序列化、以在线路上进
行传送的过程。整编代码把数据转换成适于传送的标准形式,这种形
式不依赖于本地机器的"endian-ness" 和填充(padding)规则。
解编是整编的逆过程,也就是说,使通过网络到达的数据解除序列
化,并且对数据重新进行构造,用与所使用的编程语言相适应的类型
来加以表示。
• 骨架(skeleton)代码也是根据你的Slice 定义生成的,因此,与你用
Slice 定义的对象和数据的类型是对应的。骨架代码是客户端代理代码
的服务器端等价物:它提供了向上调用(up-call)接口,允许Ice run
time 把控制线程转交给你编写的应用代码。骨架也含有整编和解编代
码,所以服务器可以接收客户发送的参数,并把参数和异常返回给客
户。
• 对象适配器(object adapter)是专用于服务器端的Ice API 的一部分:只
有服务器才使用对象适配器。对象适配器有若干功能:
• 对象适配器把来自客户的请求映射到编程语言对象上的特定方法。换
句话说,对象适配器会跟踪在内存中,都有哪些servant,其对象标识
又是什么。
• 对象适配器与一个或多个传输端点关联在一起。如果与某个适配器关
联的传输端点不止一个,你可以通过多种传输机制到达在该适配器中
的servant。例如,为了提供不同的服务质量和性能,你可以把一个
TCP/IP 端点和一个UDP 端点与一个适配器关联在一起。
• 对象适配器要负责创建可以传给客户的代理。对象适配器知道它的每
个对象的类型、标识,以及传输机制的详细情况,并且会在服务器端
应用代码要求创建代理时在其中嵌入正确的信息。
注意,从进程的层面来看,所涉及的进程只有两个:客户与服务器。对
分布式通信的所有运行时支持都是由Ice 库以及根据Slice 定义生成的代码
提供的(在使用间接代理时,需要使用第三个进程IcePack 来把代理解析
为传输端点)。