ICE introduction to programmin
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ICE introduction to programmin相关的知识,希望对你有一定的参考价值。
ICE客户端与服务器架构详解
一、客户端与服务器架构
Ice 客户与服务器内部的逻辑结构如下图所示:
客户与服务器都由这样一些代码混合而成:应用代码、库代码、根据Slice 定义生成的代码:
? Ice 核心为远地通信提供了客户端和服务器端运行时支持。其中的大量代码所涉及的是网络通信、线程、字节序,以及其他许多与网络有关的问题,我们的应用代码应该与这些问题隔离开来。
?代理代码是根据你的Slice 定义生成的。如果你调用代理的某个函数,就会有一个RPC 消息被发给服务器,调用服务端目标对象上的某个对应的函数。
在上文中提到,如下客户代码中,PrinterPrx代理类是由slice2java命令编译printer.ice文件生成的;
Ice.ObjectPrx base = ic.stringToProxy(
"SimplePrinter:default -p 10000"
);
PrinterPrx printer = PrinterPrxHelper.checkedCast(base);
printer.printString(
"Hello World!"
);
当客户调用代理上的操作时,Ice run time 会:
- 定位Ice 对象
- 如果Ice 对象的服务器没有运行,就激活它
- 在服务器中激活Ice 对象
- 把所有in 参数传送给Ice 对象
- 等待操作完成
- 把所有out 参数及返回值返回给客户(或在发生错误的情况下抛出异常)代理封装了完成这一系列步骤所必需的全部信息。特别地,代理包含有:
?寻址信息:用于让客户端run time 联系正确的服务器;
?对象标识:用于确定服务器中的哪一个对象是请求的目标;
? 可选的facet 标识符:用于确定代理所引用的是对象的哪一个facet;
? 骨架代码也是根据你的Slice 定义生成的,因此,与你用Slice 定义的对象和数据的类型是对应的。骨架代码是客户端代理代码的服务器端等价物:它提供了向上调用接口,允许Ice runtime 把控制线程转交给你编写的应用代码。
? 对象适配器是专用于服务器端的Ice API 的一部分:只有服务器才使用对象适配器。对象适配器有若干功能:
1、对象适配器把来自客户的请求映射到servant对象上的特定方法。换句话说,对象适配器会跟踪在内存中,都有哪些servant,其对象标识又是什么。对象适配器与一个或多个传输端点关联在一起。
servant就是服务器开发者编写的类,客户端发送的请求,最终调用的是servant实例上的方法。
如上文中的服务端代码片段,
Ice.ObjectAdapter adapter = ic.createObjectAdapterWithEndpoints(
"SimplePrinterAdapter"
,
"default -p 10000"
);端点“default -p 10000”与adapter适配器绑定,串“SimplePrinterAdapter”代表适配器的名称。
如果与某个适配器关联的传输端点不止一个,你可以通过多种传输机制到达在该适配器中的servant。例如,为了提供不同的服务质量和性能,你可以把一个TCP/IP 端点和一个UDP 端点与一个适配器关联在一起。
2、对象适配器要负责创建可以传给客户的代理。对象适配器知道它的每个对象的类型、标识,以及传输机制的详细情况,并且会在服务器端应用代码要求创建代理时在其中嵌入正确的信息。
每个对象适配器都维护有一个叫作活动servant 映射表(active servant map)的数据结构。活动servant 映射表(简称为ASM)是一个查找表,用于把对象标识映射到servant。
当客户把操作调用发给服务器时,请求的目标是特定的传输端点。传输端点隐含地标识了请求所针对的对象适配器(因为同一个端点只能绑定到一个对象适配器)。客户藉以发送请求的代理含有对应的对象的标识,客户端run time 会在线路上随调用一起发送这个对象标识。对象适配器继而使用这个对象标识、在它的ASM 中查找正确的servant,把调用分派给它。
以上是关于ICE introduction to programmin的主要内容,如果未能解决你的问题,请参考以下文章
Gilbert Strang 《Introduction to Linear Algebra》 chap1 Introduction to Vectors 笔记
MATH10282 Introduction to Statistics