第五课
基于 CORBA技术的程序设计方法
本章主要研究内容
? CORBA基本概念
? CORBA基本模型
? 开发工具及程序设计方法
基本概念- CORBA的基本定义
? 随着计算机体系结构的发展,产生了分布式系统
和面向对象程序设计理论,促进了计算机网络技术和
数据通信技术的发展。
? CORBA( Common Object Request Broker
Architecture,公共对象请求代理体系结构)是一种
标准的面向对象应用程序体系规范,是 OMG为解决分布
式处理环境 (DCE)中,硬件和软件系统的互连而提出的
一种解决方案。
? CORBA的核心是一套标准的语言、接口和协议,以
支持异构分布应用程序间的互操作性及独立于平台和
编程语言的对象重用。
? CORBA具有与操作系统的独立性和编程语言的独立
性,是目前实现分布式系统和面向对象程序设计的最
新技术和思想之一, 是实现异构系统联网的最先进的
方法。
基本概念- CORBA的发展历史
? CORBA最初是 OMG在 1990年 11月出版的《对象管理体系指南》中定义
的。在这过去的 14年中,CORBA的发展经历如下:
? 1991年 10月,OMG推出了 CORBA1.0版,其中定义了接口定义语言
( IDL),对象管理模型以及基于动态请求的 API和接口仓库等内容;
? 1991年 12月,OMG推出了 CORBA1.1版,在澄清了 1.0版中存在的二义
性的基础上,引入了对象适配器的概念;
? 1996年 8月,OMG基于以前的升级版本,完成了 2.0版的开发,该版
本中重要的内容是对象请求代理间协议( IIOP,Internet Inter-
ORB Protocol) 的引入,用以实现不同厂商的 ORB真正意义上的互
通;
? 1998年 9月,OMG发表了 CORBA2.3版,增加了支持 CORBA对象的异步
实时传输、服务质量规范等内容;
基本概念- CORBA的发展历史
? 2001年 9月,OMG发布最新的 CORBA2.5标准,在这个版本中,加入
了一些新的内容,包括,CORBA容错( Fault Tolerant CORBA),
实时 CORBA( Real-Time CORBA),并修改了部分 CORBA
Messaging和 Portable Interceptors的内容;
? 2002年 8月,OMG发表了 CORBA3.0版,CORBA3的这些规范增强了
CORBA性能和可用性,但是在 CORBA3.0规范中去掉了 MiniCORBA和
实时 CORBA。 从这些规范中可以很清晰的分为三大类,Java和
Internet的集成;服务质量( Qos) 控制; CORBA组件体系。
? 目前相关的 CORBA产品比较有名的如下,IONA公司的 Orbix;
Inprise公司的 VisiBroker; Digital公司的 Component Broker;
IBM公司的 Component Broker; Sun Microsystems公司的 NEO、
JOE; SunSoft公司的 DOE; 东南大学开发研制的 ORBUS等。
基本概念- CORBA的技术基础
? CORBA是一种编程方法,更是吸收了程序设计中的面向对象技
术、分布式计算技术、多层体系结构技术、多线程技术以及接口
技术的一种综合技术。
? CORBA采用了面向对象技术,CORBA2.0是完全基于面向对象技术
的。目前,CORBA3.0则是基于 Component( 组件)的方向发展。
Component可以认为是更高级别上的, 类, 。它可以在不同语言
中实现。实际上,Component是经过包装处理的一组类。
? CORBA采用了分布式计算模型,事实上,CORBA,COM/DCOM都采
用了分布式计算模型(资源、功能、任务、控制等都分布的系
统)。
? CORBA采用了多层体系结构。
?
基本概念-多层体系结构
基本概念-多层体系结构
? CORBA本身是位于中间层的中间件( Middleware),CORBA关
心的是对象的互操作,因此在资源层依旧包含有数据的操作。
CORBA是 OMG公司联盟的产品,各种服务只能由不同的公司提
供,因此在体系结构的第二层更关心的是兼容性,互通性。
? CORBA采用了接口技术,接口技术主要用于解决两个问题
? ( 1) 如何提供一种清晰的设计标准,使得软件开发在总体
设计、详细设计、具体编码阶段以及维护阶段都能够保持各
自的独立性与一致性。( 2)如何提供一种包装方式,使得
软件开发可以在不同程序语言中实现。
? 采用接口技术以后,无论采用哪种编程语言,操作都可以被
成功的激发、调用。 Component就可以被看作是用接口包装
的、跨语言的, 类, 。
基本概念-分布式计算
? 上世纪 80年代以来,分布式计算的需求
越来越大。分布式计算的特点是,
? 分布的应用程序 -- 运行在组成一个网络的
机器上的应用程序。
? 将原始代码集成进新的系统。
? 使用不同语言来写新的组件或对原始代码进
行封装。
? 在 CORBA没有出现之前的分布式计算解决方案:
? 采用 Remote procedure calls (RPCs) 远程过程调用
? 使得应用程序的函数可以由一台机器上的 client调用,
而由另一台机器上的 server执行。
? 封装性不好
? 其它的问题,如:请求的排队处理,事件通知、事务管
理,..
? CORBA出现之后的分布式计算解决方案:
? CORBA -- RPC和面向对象概念的集合体,即:
? CORBA = RPC + 面向对象概念,
?基本概念-分布式计算
CORBA -- RPC和面向对象概念的集合体
? 突出两个概念:
? 分布式组件 (distributed component)
? 基于接口的编程 (interface-based programming)
? 一些概念,如集成、委托、动态绑定在
CORBA里得到了保留。
CORBA 基本模型
? 对象管理体系结构
? OMG (Object Management Group)
? OMA (Object Management Architecture)
? CORBA体系结构
? OMG的对象模型
? ORB (Object Request Broker)
? 对象接口定义
? Client发送请求
? 对象实现接受请求
? CORBA主要技术
? CORBA规范与 CORBA产品
? 规范,CORBA 1.0 ? 2.0 ? 3.0
? 产品:商业的、免费的 返回要点
对象管理体系结构
? OMG ( http://www.omg.org/)
? 全称,Object Management Group(对象管理组织) 是一
个非盈利性的组织,成立于 1989年,现有 800多个成员公司。
他们包括 DEC,Microsoft,Netscape,Oracle,Novell、
IBM,Inprise,Informix,Iona,Hewlett-Packed,Rogue
wave,Sybase,Sun等许多著名公司。 OMG正在致力于推
广在现有的技术基础上集成应用程序的面向对象标准,其目
标是开发一种技术上先进和商业上可用,独立于厂商的软件
工业规范。 OMG是 CORBA规范的制定者。
? 目标:促进在分布式系统开发中面向对象技术的理论与实践
的发展。 OMG的职能是制定规范,而不是具体实现
? OMA
? 全称,Object Management Architecture(对象管理体系结
构),是包括 CORBA规范在内的所有 OMG规范的概念模型基础。
OMG
? OMG制定的主要规范:
? UML,Unified Modeling Language (统一建模语言 )
?面向对象分析与设计阶段的表示技术的规范 ;
?Rational公司的 Rational Rose是目前最流行的 UML软
件工具。
? CORBA,Common Object Request Broker Architecture
?保证了应用程序的可互操作性以及对于硬件平台、操作系
统、编程语言以及网络与通信协议的无关性。
?包含一系列单独的规范
? ORB体系结构
? OMG接口定义语言 IDL
? 网络通信协议 GIOP和 IIOP
? 可移植对象适配器 POA
? CORBA组件模型 CCM
OMA
? OMA是 CORBA所基于的概念框架,它描述了一个较高层次的
分布式计算环境。
OMA 正式规范,Object Management Architecture
Guide (OMG发布 )
? 描述了 OMA的技术目标和相关术语
? 为所有 CORBA规范提供了概念性的基础设施。
OMA核心内容:
? 对象模型:定义了对象外部可见特征的、独立于具体实现
的语义。
? 参考模型:标识与刻划了组成 OMA的组件、接口与协议。
OMA参考模型
公共设施领域接口
对象请求代理( ORB)
应用程序接口
对象服务
通用服务的接口
与应用有关的非标准化接口 与应用领域有关的接口 通用设施的接口
图 3 OMA参考模型
OMA参考模型
? 对象服务是基于分布式对象的所有应用程序都可
能用到的通用服务的接口 。
? 公共设施是可用于大多数应用领域的面向终端用
户的工具接口 。
? 对象服务与公共设施的主要区别在于对象服务比
公共设施更加基本 。
? 领域接口是与具体领域有关的接口 。
? 应用接口则是与应用领域有关的非标准化接口 。
OMA参考模型
? 对象服务是基于分布式对象的所有应用程序都可能用到的
通用服务的接口 。
? 公共设施是可用于大多数应用领域的面向终端用户的工具
接口 。
? 对象服务与公共设施的主要区别在于对象服务比公共设施
更加基本 。
? 领域接口是与具体领域有关的接口 。
? 应用接口则是与应用领域有关的非标准化接口 。
? 从软件体系结构的角度看, OMA的各个组件形成一种层次设
计风格, 位于最上层的是应用程序接口, 往下依次为领域
接口, 公共设施和对象服务, 最底层是对象请求代理组件 。
上层组件可跨层调用底层的组件, 例如在应用程序中可直
接调用公共设施和对象服务提供的功能 。
CORBA体系结构
? OMG的对象模型
? 对象模型描述了对象外部特征的标准语义 。
? 对象、类型、操作、属性、对象实现等语义与 Java,C++,
Eiffel等面向对象程序设计语言十分相近,但同时具有组件的
特征。
客户程序 服务对象
ORB (Object Request Broker,对象请求代理 )
? ORB 是 OMA的核心基础设施,CORBA底层
通信的核心。
? 主要功能:负责完成查找请求的对象实现、让
对象实现准备好接收请求、传递构成请求的数
据等任务所需的全部机制 。
? 规定了分布对象的定义(接口)和语言映射,
实现对象间的通讯和互操作,是分布对象系统
中的, 软总线, 。
ORB– ORB核心结构图
客户程序 对象实现
动态
调用
接口
IDL
Stub
ORB
接口
静态 IDL
Skeleton
动态
框架
对象
适配器
ORB内核
对于所有的 ORB实现都相同的接口
每一对象类型都有桩和一个框架
可能有多个对象适配器
依赖于 ORB具体实现的接口
向上调用接口
向下调用接口
返回上页 ORB介绍
对象接口定义
? 客户程序:想要执行对象上操作的实体;
对象实现(服务端):真正实现该对象的代码与数据。
? 接口采用 IDL (Interface Definition Language)语言描述。
客户程序 对象实现接口 接口
对象接口定义
? 客户程序只能通过对象的接口定义掌握对象的
逻辑结构,并通过发送请求来影响对象的行为
与状态。客户程序不必了解对象实现的具体实
现方式,也不必知道该对象实现采用哪个对象
适配器以及需要用哪个 ORB访问该对象实现。
? CORBA通过对象接口进一步延伸了传统程序
设计语言的封装与信息隐藏概念 。
Client发送请求
? 客户程序将请求发送给 ORB内核,然后
由 ORB内核将请求转发给对象实现。
两种方式:
? 静态调用 (SII)
? 动态调用 (DII)
-- 这两种调用方式从外在形式上看,具有完
全相同的能力(即两者的调用语义相同),
对象实现并不知道请求从客户端是如何发出
的。 但实现的方式是不同的。
Client发送请求
? 静态调用
? 静态调用借助于 客户程序桩 ( stub) 完成,即事先
需要生成客户程序桩 。
? 桩与框架在编译时创建并且在运行时不再改变,所
以这些接口称为 SII。
? IDL桩负责客户程序的实现语言与 ORB内核之间的
映射。
? 客户程序开发者必须在程序编译之前就知道操作的
名字和所有参数与返回值的类型,实际的操作名字、
参数值和返回值是编写在应用程序的源代码中。
Client发送请求
? 动态调用
? DII允许客户程序调用在编译客户程序时尚未确定对象接口的
对象实现。
? 客户程序使用 DII时必须生成一个请求,其中包括对象引用、
操作以及参数表。
? 使用 DII的应用程序访问对象实现提供的服务时,不必包含由
IDL编译器生成的桩,只需在运行时访问 ANY对象。
? 代价:程序员必须用 DII接口指定操作和每个参数的类型与值,
并且由程序员自己利用 CORBA定义的类型码( typecode)
作类型检查。
Client发送请求, SII or DII
? 选择这两种调用方式的基本原则:
? 如果应用程序可以用 SII实现,那么就应使用 SII,
这是因为 DII需要更多的编码(本质上是要由程序
员自己完成桩的所有任务)并且运行效率更低,并
且编译器无法帮助检查类型和优化代码。
? 后面的例子也是用的静态调用方式(即编译 IDL文
件时需生成客户桩)
对象实现接受请求
? ORB通过 IDL框架或 DSI查找合适的实现代码、
传送参数,并将控制传给对象实现,对象实现
执行请求时可通过对象适配器 OA( Object
Adapter)获取 ORB的某些服务,请求完成后控
制与结果返回给客户程序。
? 方式,静态方式 (使用框架 skeleton)
动态方式 ( DSI)
多用静态方式
对象的 ID和名称
? 所有的 CORBA对象都有一个唯一的标识符:
IOR (Interoperable Object References)。这个
标识符是由机器产生,编程中并不会直接用到。
? 一个命名对象 (named object)有一个唯一的、
好记的名字,客户可以通过这个名字访问到对
象。
? 服务端进程发布一个或多个的命名对象,客户
端进程没有命名对象。
Object Request Broker (ORB)
? 运行在每一个 CORBA进程里,职责是同
其它 ORB通信,
? 作为对象间的通信总线,
? ORB之间的通信协议是 GIOP.
点这里看 ORB结构图
What an ORB Does
? 定位对象:决定消息(调用)将要被送往哪个
对象。
? 如果对象是在另外一个进程里,把消息送往那
个进程所在的 ORB中。
? 如果对象在和 ORB的同一个进程里,保证这个
对象做好了接受请求的准备,并把参数传给对
象。
CORBA Interface Definition Language
(IDL)
? IDL是 CORBA基于接口编程( interface-centric
programming)的基础,它使得接口的编写与
具体语言选择无关。
? 特殊的语言编译器会将 IDL描述文件转换成特
殊语言的源代码,然后在此源代码的基础上实
现接口。
? IDL只是一种简单的描述性语言,是为了将规
范映射到各种具体编程语言中,本身不完成任
何操作。
IDL 语法
? 基于 C++的一些概念和语法
? 支持 typedefs,unions,enumerated types,
sequences
? 需要用特殊的编译器将 IDL文件翻译成与
语言有关的接口,比如想将 IDL翻译成
C++,需要用 IDL2CPP编译器
IDL 语法 -- Modules
? IDL使用 module结构来
创建名字空间。模块将
相关的定义组合成一个
逻辑组,防止与全局名
字空间混淆。
? 一个模块有三部分,
structure定义、
exception定义 和
interface定义。
module M {
struct S1 {…};
struct S2 {…};
…
exception E1 {…};
exception E1 {…};
…
interface I1 {…};
interface I1 {…};
…
};
IDL 语法 -- Structures
struct MyData {
short x;
string y;
AnotherStruct s;
MyInterface o;
};
IDL 语法 (cont.) -- Exceptions
? CORBA中处理错误的
标准方式。
? 在语法上与 structure
一样 – 有一个名字,
还有一些成员数据,
这些数据在发生异常
时将会被传送 。
exception Oops {
string whatiswrong;
long exceptioncode;
};
IDL 语法 (cont.) -- Interfaces
? 远程对象的接口在 interface里定义
? IDL interface I 包含变量的声明和方法的声明
interface I {
// constant declarations
// method declarations
};
An Example Written in CORBA IDL
//M.idl
Module M {
exception Oops {
string whatisworng;
};
interface MyInfo {
string name;
void setName( in string aName);//in:参数由客户程序发送给服务程序
}
interface InfoManager {
void register ( in MyInfo info ) raises (Oops);
boolean find ( in string name,out MyInfo info);
}; //out:参数由服务程序发送给客户程序
};
产品
(1) 商品化 CORBA产品
? IONA Orbix//功能强大
? Borland VisiBroker//可视化好,编程简单
? BEA Weblogic
? IBM Websphere
(2)免费的 CORBA产品
? OmniORB
? TAO
? ORBit
? ORBacus
(3) CORBA产品实际上就是 ORB产品
应用最广泛
End of Part II
CORBA应用程序开发
? CORBA应用程序开发过程
? 具体开发实例
典型的 CORBA应用
表示层
中间层
数据层 数据库
CORBA对象
CORBA客户端
CORBA应用开发过程
? CORBA规范并没有限制 ORB的具体实现方法,
所以不同厂商对 ORB的具体实现方法可能差别
很大,这就导致不同厂商提供的 ORB上操作可
能有很大的差异。但基本过程都是类似的。
利用 OO方法进行分析设计
标识应用程序所需的对象
实现每个对象,部署,运行
典型的 CORBA应用实现过程
一个典型 CORBA
应用的实现过程
(可回到 21页)
编写对象接口
? 对象接口是关于服务对象语法的规格说
明。接口定义中包括:
? 提供或使用的服务的名字
? 参数
? 返回值
? 异常
? 上下文环境等
? 对象接口由 OMG IDL语言定义
编译 IDL文件
? 厂商实现 IDL编译器时应参照 OMG制订的语言的规范,
编程人员只要选择使用合适的编译器就可以了。
? VisiBroker for C++/Java/Delphi分别提供
idl2cpp/idl2java/idl2pas编译器将 IDL映射到 C++语言
/Java语言 /Object Pascal语言,生成相应语言的客户端
桩代码以及服务端框架代码。
IDL编译器IDL文件
Stub
Skeleton
输入
输出
输出
编写客户程序
客户程序操作流程 初始化 ORB
绑定到服务对象
调用服务对象提供的服务
初始化 ORB
? 无论是客户程序还是服务程序,都必须在利用
ORB进行通信之前初始化 ORB。
? 初始化 ORB的作用
? 让 ORB了解有新的成员加入。
? 获取 ORB伪对象的引用,以备将来调用 ORB内核提
供的操作。
? 所谓伪对象专指在 CORBA基础设施中的一个对象
? 伪对象是本地的。
? 利用伪对象调用 CORBA基础设施提供的服务。
? 用一种统一的观点看待所有对象。
? 伪对象也使用 IDL定义。
ORB服务
? ORB内核提供了一些不依赖于任何对象
适配器的操作(与用户具体编程无关 )
? 初始化 ORB
? 获取初始引用的操作
? 动态调用相关的操作
? 生成类型码的操作
? 线程和策略相关的操作
编写对象实现和服务程序代码
? 编写对象实现:
? IDL文件只定义了服务对象的规格说明,程序员必须另外
编写服务对象的具体实现。
? 对象实现则有很多选择的余地:
? Java,C++,C,Smalltalk等等
? 对象实现所用的语言与客户程序所选用的语言无关,只
要 ORB产品供应商支持 IDL到这些语言的映射即可。
? 程序员应该熟悉 IDL到所选择的语言的映射规则,因为:
? IDL编译器除了生成 Stub和 Skeleton外,还会自动生成
一些对象实现需要用到的辅助代码。
? VisiBroker的 idl2cpp/idl2java会生成一些对象适
配器的 C++/Java类和各种辅助性的 C++/Java类,编
写对象实现的代码时必须继承其中的一些类或使用
某些类提供的方法。
编写对象实现和服务程序代码
? 编写对象实现后,还必须实现服务程序
的 main例程。
? 服务程序利用可移植对象适配器( POA)激
活伺服对象供客户程序使用。
? 服务程序通常是一个循环执行的进程,不断
监听客户程序请求并为之服务。
创建并部署应用程序
? 一些 ORB产品提供了专门的编译器以简
化这一过程
客户程
序代码
IDL生成
的 Stub
客户端
应用程序
编译
服务端
代码
IDL生成的
Skeleton
服务端
应用程序
编译
创建客户端应用程序 创建服务端应用程序
创建并部署应用程序
? 部署应用程序
? 在部署阶段由系统管理员规划如何在终端用
户的桌面系统安装客户程序,或在服务器一
类的机器上安装服务程序。
? 部署工作由单独的角色来承担
运行应用程序
? 运行 CORBA应用程序时,必须 首先启动
服务程序,然后才可运行客户程序。
? VisiBroker 要求其 ORB内核( osagent)必
须在客户程序启动之前启动完成。
3.2 具体开发实例
? 从应用的角度介绍
? 系统软件开发环境介绍及选型
? 具体实例 ——一个简单的 C/S响应系统
操作系统和编程语言
CORBA能够跨操作系统,跨编程语言,因此原则上代码
的实现可以用操作系统支持的任何编程语言,这里我
们就最常见的操作系统予以示例。
? Windows操作系统
? Linux操作系统
? 支持各种编程语言包括 C,C++,Perl,Java、
Fortran,Object Pascal,Basic等等。
? 常用 CORBA实现语言用 C++,Java和 Object Pascal。
? 后面的实例将就 Windows下的 C++语言讨论。
CORBA的 ORB产品选型
? 免费产品
? 种类较多
? 缺乏正规商家开发
? 功能上讲不能及时跟进最新的 CORBA规范
? 兼容性能上讲有很大的局限性
? 商品化产品
? IONA公司的 Orbix
? Inprise(原 Borland)公司的 VisiBroker
具体实例 ——一个简单的 C/S响应系统
? 操作系统
Windows 2000
? 编程工具(语言)
Borland C++ Builder 6 (C++)
? ORB产品
VisiBroker for C++,version 4.5.00
例子背景
? 一个简单的客户 /服务器响应系统
? 客户端向服务器端提供客户名称和请求服务的
名称
? 服务器端显示服务日志
对象认定
? 本例只有一个简单对象 TheResponse:即
服务器端根据客户端上传的数据产生的响应。
服务器 (S) 客户端 (C)
ORB
TheResponse()
定义对象接口
// C/S响应系统对象接口定义
interface CorbaObj{
string TheResponse(
//客户名称
in string ClientName,
//请求服务名称
in string ServiceName
);
};
? 可用文本编辑器编辑,保存文件为 File1.idl
? 也可以直接利用 BC++ Builder(下面简称为 BCB)中的
Corba Server (Wizard)产生的 IDL编辑窗编辑
生成 Stub与 Skeleton
? 可通过命令行编译
prompt> idl2cpp File1.idl
? 直接利用 BCB中的 CORBA Object Implementation (Wizard)编译生
成存根(桩)和框架文件
idl2cppFile1.idl
Stub
Skeleton输入
输出
其它辅助
文件
生成 Stub与 Skeleton (cont.)
? VisiBroker for C++的 IDL编译器 idl2cpp为每个
接口自动生成 4个文件:
? File1_c.cpp (Stub存根文件 )
? File1_c.hh (Stub的头文件 )
? File1_s.cpp (Skeleton框架文件 )
? File1_s.hh (Skeleton的头文件 )
? 由于接口存根对象及接口框架对象文件内容总
是大同小异,我们不详细解释,有兴趣的同学
可以自己做实验加深理解
生成代码框架
? 对象实现向导 (CORBA Object Implementation
(Wizard))为接口对象生成一个代码框架,
用户在此代码框架上编写具体对象实现
代码
? 本例代码框架文件:
? CorbaObjServer.h
? CorbaObjServer.cpp
生成代码框架 (cont.)
? CorbaObjServer.h:
//-------------------------------------------------------------------------------------------
#ifndef CorbaObjServerH
#define CorbaObjServerH
#include ―File1_s.hh‖
//-------------------------------------------------------------------------------------------
class CorbaObjImpl,public _sk_CorbaObj
{
protected:
public:
CorbaObjImpl(const char *object_name=NULL);
char* TheResponse(const char* ClientName,
const char* ServiceName);
};
#endif
? 接口框架对象 _sk_CorbaObj由 CorbaObjImpl类实现
生成代码框架 (cont.)
? CorbaObjServer.cpp
//-------------------------------------------------------------------------------------------
#include<vcl.h>
#pragma hdrstop
#include<corba.h>
#include ―CorbaObjServer.h‖
//-------------------------------------------------------------------------------------------
#pragma package(smart_init)
CorbaObjImpl::CorbaObjImpl(const char *object_name):
_sk_CorbaObj(object_name)
{
}
char* CorbaObjImpl::TheResponse(const char* ClientName,
const char* ServiceName)
{ //由用户在此编写具体对象实现代码
}
编写对象实现
? CorbaObjServer.cpp仅仅是对象实现的一个代码框架,
用户必须自己编写方法、操作以最终完成对象实现 。
? 在 CorbaObjImpl::TheResponse函数中加入实现代码:
//根据功能编写实现代码 实现服务器端的日志显示
AnsiString Log = ―客户名称:” ;
Log += ClientName; //由客户端传入的客户名称
Log += ―;服务内容:” ;
Log += ServiceName; //由客户端传入的请求服务的名称
Log += ―;时间:” ;
Log += FormatDateTime(―yyyy’年‘ m’月‘ d’日‘ h’点‘ m’分‘ s’秒
‘”,Now());
Form1->Memo1->Lines->Add(Log); //在服务器端文本框中显示日志
(转下页 )
编写对象实现 (cont.)
(接上页 ) //准备响应数据
AnsiString Result = ―您好” ;
Result += ClientName;
Result += ―!我是 CorbaObj,您要的服务是:” ;
Result += ServiceName;
Result += ―。您愿意为此服务付款吗?” ;
Result += FormatDateTime(―yyyy’年‘ m’月‘ d’日‘ h’点‘ m’分‘ s’秒
‘”,Now());
//返回响应数据
return Result.c_str();
? 上述代码完成了两件任务:编写服务日志及响应客户
请求。
? 用 C++ Builder编译最终实现代码
编写客户程序
? 客户程序向导生成一个客户程序框架
? 客户程序向导完成属性和对象引用的绑定,具体代码
如下:
CorbaObj_ptr __fastcall TForm1::GetcorbaObj(void)
{
if(FcorbaObj == NULL)
{
FcorbaObj = CorbaObj::_bind();
}
return FcorbaObj;
}
void __fastcall TForm1::SetcorbaObj(CorbaObj_ptr _ptr)
{
FcorbaObj = _ptr;
}
编写客户程序 (cont.)
? 在客户端添加一个, 发送, 按钮,编写实现代
码
//发送客户名称和服务名称
Memo1->Lines->Add(
corbaObj->TheResponse(
Edit1->Text.c_str(),
Edit2->Text.c_str()
)
);
? 用 C++ Builder编译最终实现代码
运行 CORBA程序
? 按一定的顺序启动应用程序
? 1.启动智能代理 VisiBroker Smart Agent
运行 CORBA应用程序之前,局域网内必须 至少有一
台主机上启动了智能代理 osagent。这是 VisiBroker
特有的分布式位置服务( location service)守护进
程,网络中多个智能代理可协作以查找合适的对象
实现。
? 2.在服务器端启动 CORBA服务器程序,也就
是 CORBA对象实现程序
? 3.在客户端启动 CORBA客户程序
运行 CORBA程序 (cont.)
? 服务器程序运行情况
运行 CORBA程序 (cont.)
? 客户端程序运行情况
基于 CORBA技术的程序设计方法
本章主要研究内容
? CORBA基本概念
? CORBA基本模型
? 开发工具及程序设计方法
基本概念- CORBA的基本定义
? 随着计算机体系结构的发展,产生了分布式系统
和面向对象程序设计理论,促进了计算机网络技术和
数据通信技术的发展。
? CORBA( Common Object Request Broker
Architecture,公共对象请求代理体系结构)是一种
标准的面向对象应用程序体系规范,是 OMG为解决分布
式处理环境 (DCE)中,硬件和软件系统的互连而提出的
一种解决方案。
? CORBA的核心是一套标准的语言、接口和协议,以
支持异构分布应用程序间的互操作性及独立于平台和
编程语言的对象重用。
? CORBA具有与操作系统的独立性和编程语言的独立
性,是目前实现分布式系统和面向对象程序设计的最
新技术和思想之一, 是实现异构系统联网的最先进的
方法。
基本概念- CORBA的发展历史
? CORBA最初是 OMG在 1990年 11月出版的《对象管理体系指南》中定义
的。在这过去的 14年中,CORBA的发展经历如下:
? 1991年 10月,OMG推出了 CORBA1.0版,其中定义了接口定义语言
( IDL),对象管理模型以及基于动态请求的 API和接口仓库等内容;
? 1991年 12月,OMG推出了 CORBA1.1版,在澄清了 1.0版中存在的二义
性的基础上,引入了对象适配器的概念;
? 1996年 8月,OMG基于以前的升级版本,完成了 2.0版的开发,该版
本中重要的内容是对象请求代理间协议( IIOP,Internet Inter-
ORB Protocol) 的引入,用以实现不同厂商的 ORB真正意义上的互
通;
? 1998年 9月,OMG发表了 CORBA2.3版,增加了支持 CORBA对象的异步
实时传输、服务质量规范等内容;
基本概念- CORBA的发展历史
? 2001年 9月,OMG发布最新的 CORBA2.5标准,在这个版本中,加入
了一些新的内容,包括,CORBA容错( Fault Tolerant CORBA),
实时 CORBA( Real-Time CORBA),并修改了部分 CORBA
Messaging和 Portable Interceptors的内容;
? 2002年 8月,OMG发表了 CORBA3.0版,CORBA3的这些规范增强了
CORBA性能和可用性,但是在 CORBA3.0规范中去掉了 MiniCORBA和
实时 CORBA。 从这些规范中可以很清晰的分为三大类,Java和
Internet的集成;服务质量( Qos) 控制; CORBA组件体系。
? 目前相关的 CORBA产品比较有名的如下,IONA公司的 Orbix;
Inprise公司的 VisiBroker; Digital公司的 Component Broker;
IBM公司的 Component Broker; Sun Microsystems公司的 NEO、
JOE; SunSoft公司的 DOE; 东南大学开发研制的 ORBUS等。
基本概念- CORBA的技术基础
? CORBA是一种编程方法,更是吸收了程序设计中的面向对象技
术、分布式计算技术、多层体系结构技术、多线程技术以及接口
技术的一种综合技术。
? CORBA采用了面向对象技术,CORBA2.0是完全基于面向对象技术
的。目前,CORBA3.0则是基于 Component( 组件)的方向发展。
Component可以认为是更高级别上的, 类, 。它可以在不同语言
中实现。实际上,Component是经过包装处理的一组类。
? CORBA采用了分布式计算模型,事实上,CORBA,COM/DCOM都采
用了分布式计算模型(资源、功能、任务、控制等都分布的系
统)。
? CORBA采用了多层体系结构。
?
基本概念-多层体系结构
基本概念-多层体系结构
? CORBA本身是位于中间层的中间件( Middleware),CORBA关
心的是对象的互操作,因此在资源层依旧包含有数据的操作。
CORBA是 OMG公司联盟的产品,各种服务只能由不同的公司提
供,因此在体系结构的第二层更关心的是兼容性,互通性。
? CORBA采用了接口技术,接口技术主要用于解决两个问题
? ( 1) 如何提供一种清晰的设计标准,使得软件开发在总体
设计、详细设计、具体编码阶段以及维护阶段都能够保持各
自的独立性与一致性。( 2)如何提供一种包装方式,使得
软件开发可以在不同程序语言中实现。
? 采用接口技术以后,无论采用哪种编程语言,操作都可以被
成功的激发、调用。 Component就可以被看作是用接口包装
的、跨语言的, 类, 。
基本概念-分布式计算
? 上世纪 80年代以来,分布式计算的需求
越来越大。分布式计算的特点是,
? 分布的应用程序 -- 运行在组成一个网络的
机器上的应用程序。
? 将原始代码集成进新的系统。
? 使用不同语言来写新的组件或对原始代码进
行封装。
? 在 CORBA没有出现之前的分布式计算解决方案:
? 采用 Remote procedure calls (RPCs) 远程过程调用
? 使得应用程序的函数可以由一台机器上的 client调用,
而由另一台机器上的 server执行。
? 封装性不好
? 其它的问题,如:请求的排队处理,事件通知、事务管
理,..
? CORBA出现之后的分布式计算解决方案:
? CORBA -- RPC和面向对象概念的集合体,即:
? CORBA = RPC + 面向对象概念,
?基本概念-分布式计算
CORBA -- RPC和面向对象概念的集合体
? 突出两个概念:
? 分布式组件 (distributed component)
? 基于接口的编程 (interface-based programming)
? 一些概念,如集成、委托、动态绑定在
CORBA里得到了保留。
CORBA 基本模型
? 对象管理体系结构
? OMG (Object Management Group)
? OMA (Object Management Architecture)
? CORBA体系结构
? OMG的对象模型
? ORB (Object Request Broker)
? 对象接口定义
? Client发送请求
? 对象实现接受请求
? CORBA主要技术
? CORBA规范与 CORBA产品
? 规范,CORBA 1.0 ? 2.0 ? 3.0
? 产品:商业的、免费的 返回要点
对象管理体系结构
? OMG ( http://www.omg.org/)
? 全称,Object Management Group(对象管理组织) 是一
个非盈利性的组织,成立于 1989年,现有 800多个成员公司。
他们包括 DEC,Microsoft,Netscape,Oracle,Novell、
IBM,Inprise,Informix,Iona,Hewlett-Packed,Rogue
wave,Sybase,Sun等许多著名公司。 OMG正在致力于推
广在现有的技术基础上集成应用程序的面向对象标准,其目
标是开发一种技术上先进和商业上可用,独立于厂商的软件
工业规范。 OMG是 CORBA规范的制定者。
? 目标:促进在分布式系统开发中面向对象技术的理论与实践
的发展。 OMG的职能是制定规范,而不是具体实现
? OMA
? 全称,Object Management Architecture(对象管理体系结
构),是包括 CORBA规范在内的所有 OMG规范的概念模型基础。
OMG
? OMG制定的主要规范:
? UML,Unified Modeling Language (统一建模语言 )
?面向对象分析与设计阶段的表示技术的规范 ;
?Rational公司的 Rational Rose是目前最流行的 UML软
件工具。
? CORBA,Common Object Request Broker Architecture
?保证了应用程序的可互操作性以及对于硬件平台、操作系
统、编程语言以及网络与通信协议的无关性。
?包含一系列单独的规范
? ORB体系结构
? OMG接口定义语言 IDL
? 网络通信协议 GIOP和 IIOP
? 可移植对象适配器 POA
? CORBA组件模型 CCM
OMA
? OMA是 CORBA所基于的概念框架,它描述了一个较高层次的
分布式计算环境。
OMA 正式规范,Object Management Architecture
Guide (OMG发布 )
? 描述了 OMA的技术目标和相关术语
? 为所有 CORBA规范提供了概念性的基础设施。
OMA核心内容:
? 对象模型:定义了对象外部可见特征的、独立于具体实现
的语义。
? 参考模型:标识与刻划了组成 OMA的组件、接口与协议。
OMA参考模型
公共设施领域接口
对象请求代理( ORB)
应用程序接口
对象服务
通用服务的接口
与应用有关的非标准化接口 与应用领域有关的接口 通用设施的接口
图 3 OMA参考模型
OMA参考模型
? 对象服务是基于分布式对象的所有应用程序都可
能用到的通用服务的接口 。
? 公共设施是可用于大多数应用领域的面向终端用
户的工具接口 。
? 对象服务与公共设施的主要区别在于对象服务比
公共设施更加基本 。
? 领域接口是与具体领域有关的接口 。
? 应用接口则是与应用领域有关的非标准化接口 。
OMA参考模型
? 对象服务是基于分布式对象的所有应用程序都可能用到的
通用服务的接口 。
? 公共设施是可用于大多数应用领域的面向终端用户的工具
接口 。
? 对象服务与公共设施的主要区别在于对象服务比公共设施
更加基本 。
? 领域接口是与具体领域有关的接口 。
? 应用接口则是与应用领域有关的非标准化接口 。
? 从软件体系结构的角度看, OMA的各个组件形成一种层次设
计风格, 位于最上层的是应用程序接口, 往下依次为领域
接口, 公共设施和对象服务, 最底层是对象请求代理组件 。
上层组件可跨层调用底层的组件, 例如在应用程序中可直
接调用公共设施和对象服务提供的功能 。
CORBA体系结构
? OMG的对象模型
? 对象模型描述了对象外部特征的标准语义 。
? 对象、类型、操作、属性、对象实现等语义与 Java,C++,
Eiffel等面向对象程序设计语言十分相近,但同时具有组件的
特征。
客户程序 服务对象
ORB (Object Request Broker,对象请求代理 )
? ORB 是 OMA的核心基础设施,CORBA底层
通信的核心。
? 主要功能:负责完成查找请求的对象实现、让
对象实现准备好接收请求、传递构成请求的数
据等任务所需的全部机制 。
? 规定了分布对象的定义(接口)和语言映射,
实现对象间的通讯和互操作,是分布对象系统
中的, 软总线, 。
ORB– ORB核心结构图
客户程序 对象实现
动态
调用
接口
IDL
Stub
ORB
接口
静态 IDL
Skeleton
动态
框架
对象
适配器
ORB内核
对于所有的 ORB实现都相同的接口
每一对象类型都有桩和一个框架
可能有多个对象适配器
依赖于 ORB具体实现的接口
向上调用接口
向下调用接口
返回上页 ORB介绍
对象接口定义
? 客户程序:想要执行对象上操作的实体;
对象实现(服务端):真正实现该对象的代码与数据。
? 接口采用 IDL (Interface Definition Language)语言描述。
客户程序 对象实现接口 接口
对象接口定义
? 客户程序只能通过对象的接口定义掌握对象的
逻辑结构,并通过发送请求来影响对象的行为
与状态。客户程序不必了解对象实现的具体实
现方式,也不必知道该对象实现采用哪个对象
适配器以及需要用哪个 ORB访问该对象实现。
? CORBA通过对象接口进一步延伸了传统程序
设计语言的封装与信息隐藏概念 。
Client发送请求
? 客户程序将请求发送给 ORB内核,然后
由 ORB内核将请求转发给对象实现。
两种方式:
? 静态调用 (SII)
? 动态调用 (DII)
-- 这两种调用方式从外在形式上看,具有完
全相同的能力(即两者的调用语义相同),
对象实现并不知道请求从客户端是如何发出
的。 但实现的方式是不同的。
Client发送请求
? 静态调用
? 静态调用借助于 客户程序桩 ( stub) 完成,即事先
需要生成客户程序桩 。
? 桩与框架在编译时创建并且在运行时不再改变,所
以这些接口称为 SII。
? IDL桩负责客户程序的实现语言与 ORB内核之间的
映射。
? 客户程序开发者必须在程序编译之前就知道操作的
名字和所有参数与返回值的类型,实际的操作名字、
参数值和返回值是编写在应用程序的源代码中。
Client发送请求
? 动态调用
? DII允许客户程序调用在编译客户程序时尚未确定对象接口的
对象实现。
? 客户程序使用 DII时必须生成一个请求,其中包括对象引用、
操作以及参数表。
? 使用 DII的应用程序访问对象实现提供的服务时,不必包含由
IDL编译器生成的桩,只需在运行时访问 ANY对象。
? 代价:程序员必须用 DII接口指定操作和每个参数的类型与值,
并且由程序员自己利用 CORBA定义的类型码( typecode)
作类型检查。
Client发送请求, SII or DII
? 选择这两种调用方式的基本原则:
? 如果应用程序可以用 SII实现,那么就应使用 SII,
这是因为 DII需要更多的编码(本质上是要由程序
员自己完成桩的所有任务)并且运行效率更低,并
且编译器无法帮助检查类型和优化代码。
? 后面的例子也是用的静态调用方式(即编译 IDL文
件时需生成客户桩)
对象实现接受请求
? ORB通过 IDL框架或 DSI查找合适的实现代码、
传送参数,并将控制传给对象实现,对象实现
执行请求时可通过对象适配器 OA( Object
Adapter)获取 ORB的某些服务,请求完成后控
制与结果返回给客户程序。
? 方式,静态方式 (使用框架 skeleton)
动态方式 ( DSI)
多用静态方式
对象的 ID和名称
? 所有的 CORBA对象都有一个唯一的标识符:
IOR (Interoperable Object References)。这个
标识符是由机器产生,编程中并不会直接用到。
? 一个命名对象 (named object)有一个唯一的、
好记的名字,客户可以通过这个名字访问到对
象。
? 服务端进程发布一个或多个的命名对象,客户
端进程没有命名对象。
Object Request Broker (ORB)
? 运行在每一个 CORBA进程里,职责是同
其它 ORB通信,
? 作为对象间的通信总线,
? ORB之间的通信协议是 GIOP.
点这里看 ORB结构图
What an ORB Does
? 定位对象:决定消息(调用)将要被送往哪个
对象。
? 如果对象是在另外一个进程里,把消息送往那
个进程所在的 ORB中。
? 如果对象在和 ORB的同一个进程里,保证这个
对象做好了接受请求的准备,并把参数传给对
象。
CORBA Interface Definition Language
(IDL)
? IDL是 CORBA基于接口编程( interface-centric
programming)的基础,它使得接口的编写与
具体语言选择无关。
? 特殊的语言编译器会将 IDL描述文件转换成特
殊语言的源代码,然后在此源代码的基础上实
现接口。
? IDL只是一种简单的描述性语言,是为了将规
范映射到各种具体编程语言中,本身不完成任
何操作。
IDL 语法
? 基于 C++的一些概念和语法
? 支持 typedefs,unions,enumerated types,
sequences
? 需要用特殊的编译器将 IDL文件翻译成与
语言有关的接口,比如想将 IDL翻译成
C++,需要用 IDL2CPP编译器
IDL 语法 -- Modules
? IDL使用 module结构来
创建名字空间。模块将
相关的定义组合成一个
逻辑组,防止与全局名
字空间混淆。
? 一个模块有三部分,
structure定义、
exception定义 和
interface定义。
module M {
struct S1 {…};
struct S2 {…};
…
exception E1 {…};
exception E1 {…};
…
interface I1 {…};
interface I1 {…};
…
};
IDL 语法 -- Structures
struct MyData {
short x;
string y;
AnotherStruct s;
MyInterface o;
};
IDL 语法 (cont.) -- Exceptions
? CORBA中处理错误的
标准方式。
? 在语法上与 structure
一样 – 有一个名字,
还有一些成员数据,
这些数据在发生异常
时将会被传送 。
exception Oops {
string whatiswrong;
long exceptioncode;
};
IDL 语法 (cont.) -- Interfaces
? 远程对象的接口在 interface里定义
? IDL interface I 包含变量的声明和方法的声明
interface I {
// constant declarations
// method declarations
};
An Example Written in CORBA IDL
//M.idl
Module M {
exception Oops {
string whatisworng;
};
interface MyInfo {
string name;
void setName( in string aName);//in:参数由客户程序发送给服务程序
}
interface InfoManager {
void register ( in MyInfo info ) raises (Oops);
boolean find ( in string name,out MyInfo info);
}; //out:参数由服务程序发送给客户程序
};
产品
(1) 商品化 CORBA产品
? IONA Orbix//功能强大
? Borland VisiBroker//可视化好,编程简单
? BEA Weblogic
? IBM Websphere
(2)免费的 CORBA产品
? OmniORB
? TAO
? ORBit
? ORBacus
(3) CORBA产品实际上就是 ORB产品
应用最广泛
End of Part II
CORBA应用程序开发
? CORBA应用程序开发过程
? 具体开发实例
典型的 CORBA应用
表示层
中间层
数据层 数据库
CORBA对象
CORBA客户端
CORBA应用开发过程
? CORBA规范并没有限制 ORB的具体实现方法,
所以不同厂商对 ORB的具体实现方法可能差别
很大,这就导致不同厂商提供的 ORB上操作可
能有很大的差异。但基本过程都是类似的。
利用 OO方法进行分析设计
标识应用程序所需的对象
实现每个对象,部署,运行
典型的 CORBA应用实现过程
一个典型 CORBA
应用的实现过程
(可回到 21页)
编写对象接口
? 对象接口是关于服务对象语法的规格说
明。接口定义中包括:
? 提供或使用的服务的名字
? 参数
? 返回值
? 异常
? 上下文环境等
? 对象接口由 OMG IDL语言定义
编译 IDL文件
? 厂商实现 IDL编译器时应参照 OMG制订的语言的规范,
编程人员只要选择使用合适的编译器就可以了。
? VisiBroker for C++/Java/Delphi分别提供
idl2cpp/idl2java/idl2pas编译器将 IDL映射到 C++语言
/Java语言 /Object Pascal语言,生成相应语言的客户端
桩代码以及服务端框架代码。
IDL编译器IDL文件
Stub
Skeleton
输入
输出
输出
编写客户程序
客户程序操作流程 初始化 ORB
绑定到服务对象
调用服务对象提供的服务
初始化 ORB
? 无论是客户程序还是服务程序,都必须在利用
ORB进行通信之前初始化 ORB。
? 初始化 ORB的作用
? 让 ORB了解有新的成员加入。
? 获取 ORB伪对象的引用,以备将来调用 ORB内核提
供的操作。
? 所谓伪对象专指在 CORBA基础设施中的一个对象
? 伪对象是本地的。
? 利用伪对象调用 CORBA基础设施提供的服务。
? 用一种统一的观点看待所有对象。
? 伪对象也使用 IDL定义。
ORB服务
? ORB内核提供了一些不依赖于任何对象
适配器的操作(与用户具体编程无关 )
? 初始化 ORB
? 获取初始引用的操作
? 动态调用相关的操作
? 生成类型码的操作
? 线程和策略相关的操作
编写对象实现和服务程序代码
? 编写对象实现:
? IDL文件只定义了服务对象的规格说明,程序员必须另外
编写服务对象的具体实现。
? 对象实现则有很多选择的余地:
? Java,C++,C,Smalltalk等等
? 对象实现所用的语言与客户程序所选用的语言无关,只
要 ORB产品供应商支持 IDL到这些语言的映射即可。
? 程序员应该熟悉 IDL到所选择的语言的映射规则,因为:
? IDL编译器除了生成 Stub和 Skeleton外,还会自动生成
一些对象实现需要用到的辅助代码。
? VisiBroker的 idl2cpp/idl2java会生成一些对象适
配器的 C++/Java类和各种辅助性的 C++/Java类,编
写对象实现的代码时必须继承其中的一些类或使用
某些类提供的方法。
编写对象实现和服务程序代码
? 编写对象实现后,还必须实现服务程序
的 main例程。
? 服务程序利用可移植对象适配器( POA)激
活伺服对象供客户程序使用。
? 服务程序通常是一个循环执行的进程,不断
监听客户程序请求并为之服务。
创建并部署应用程序
? 一些 ORB产品提供了专门的编译器以简
化这一过程
客户程
序代码
IDL生成
的 Stub
客户端
应用程序
编译
服务端
代码
IDL生成的
Skeleton
服务端
应用程序
编译
创建客户端应用程序 创建服务端应用程序
创建并部署应用程序
? 部署应用程序
? 在部署阶段由系统管理员规划如何在终端用
户的桌面系统安装客户程序,或在服务器一
类的机器上安装服务程序。
? 部署工作由单独的角色来承担
运行应用程序
? 运行 CORBA应用程序时,必须 首先启动
服务程序,然后才可运行客户程序。
? VisiBroker 要求其 ORB内核( osagent)必
须在客户程序启动之前启动完成。
3.2 具体开发实例
? 从应用的角度介绍
? 系统软件开发环境介绍及选型
? 具体实例 ——一个简单的 C/S响应系统
操作系统和编程语言
CORBA能够跨操作系统,跨编程语言,因此原则上代码
的实现可以用操作系统支持的任何编程语言,这里我
们就最常见的操作系统予以示例。
? Windows操作系统
? Linux操作系统
? 支持各种编程语言包括 C,C++,Perl,Java、
Fortran,Object Pascal,Basic等等。
? 常用 CORBA实现语言用 C++,Java和 Object Pascal。
? 后面的实例将就 Windows下的 C++语言讨论。
CORBA的 ORB产品选型
? 免费产品
? 种类较多
? 缺乏正规商家开发
? 功能上讲不能及时跟进最新的 CORBA规范
? 兼容性能上讲有很大的局限性
? 商品化产品
? IONA公司的 Orbix
? Inprise(原 Borland)公司的 VisiBroker
具体实例 ——一个简单的 C/S响应系统
? 操作系统
Windows 2000
? 编程工具(语言)
Borland C++ Builder 6 (C++)
? ORB产品
VisiBroker for C++,version 4.5.00
例子背景
? 一个简单的客户 /服务器响应系统
? 客户端向服务器端提供客户名称和请求服务的
名称
? 服务器端显示服务日志
对象认定
? 本例只有一个简单对象 TheResponse:即
服务器端根据客户端上传的数据产生的响应。
服务器 (S) 客户端 (C)
ORB
TheResponse()
定义对象接口
// C/S响应系统对象接口定义
interface CorbaObj{
string TheResponse(
//客户名称
in string ClientName,
//请求服务名称
in string ServiceName
);
};
? 可用文本编辑器编辑,保存文件为 File1.idl
? 也可以直接利用 BC++ Builder(下面简称为 BCB)中的
Corba Server (Wizard)产生的 IDL编辑窗编辑
生成 Stub与 Skeleton
? 可通过命令行编译
prompt> idl2cpp File1.idl
? 直接利用 BCB中的 CORBA Object Implementation (Wizard)编译生
成存根(桩)和框架文件
idl2cppFile1.idl
Stub
Skeleton输入
输出
其它辅助
文件
生成 Stub与 Skeleton (cont.)
? VisiBroker for C++的 IDL编译器 idl2cpp为每个
接口自动生成 4个文件:
? File1_c.cpp (Stub存根文件 )
? File1_c.hh (Stub的头文件 )
? File1_s.cpp (Skeleton框架文件 )
? File1_s.hh (Skeleton的头文件 )
? 由于接口存根对象及接口框架对象文件内容总
是大同小异,我们不详细解释,有兴趣的同学
可以自己做实验加深理解
生成代码框架
? 对象实现向导 (CORBA Object Implementation
(Wizard))为接口对象生成一个代码框架,
用户在此代码框架上编写具体对象实现
代码
? 本例代码框架文件:
? CorbaObjServer.h
? CorbaObjServer.cpp
生成代码框架 (cont.)
? CorbaObjServer.h:
//-------------------------------------------------------------------------------------------
#ifndef CorbaObjServerH
#define CorbaObjServerH
#include ―File1_s.hh‖
//-------------------------------------------------------------------------------------------
class CorbaObjImpl,public _sk_CorbaObj
{
protected:
public:
CorbaObjImpl(const char *object_name=NULL);
char* TheResponse(const char* ClientName,
const char* ServiceName);
};
#endif
? 接口框架对象 _sk_CorbaObj由 CorbaObjImpl类实现
生成代码框架 (cont.)
? CorbaObjServer.cpp
//-------------------------------------------------------------------------------------------
#include<vcl.h>
#pragma hdrstop
#include<corba.h>
#include ―CorbaObjServer.h‖
//-------------------------------------------------------------------------------------------
#pragma package(smart_init)
CorbaObjImpl::CorbaObjImpl(const char *object_name):
_sk_CorbaObj(object_name)
{
}
char* CorbaObjImpl::TheResponse(const char* ClientName,
const char* ServiceName)
{ //由用户在此编写具体对象实现代码
}
编写对象实现
? CorbaObjServer.cpp仅仅是对象实现的一个代码框架,
用户必须自己编写方法、操作以最终完成对象实现 。
? 在 CorbaObjImpl::TheResponse函数中加入实现代码:
//根据功能编写实现代码 实现服务器端的日志显示
AnsiString Log = ―客户名称:” ;
Log += ClientName; //由客户端传入的客户名称
Log += ―;服务内容:” ;
Log += ServiceName; //由客户端传入的请求服务的名称
Log += ―;时间:” ;
Log += FormatDateTime(―yyyy’年‘ m’月‘ d’日‘ h’点‘ m’分‘ s’秒
‘”,Now());
Form1->Memo1->Lines->Add(Log); //在服务器端文本框中显示日志
(转下页 )
编写对象实现 (cont.)
(接上页 ) //准备响应数据
AnsiString Result = ―您好” ;
Result += ClientName;
Result += ―!我是 CorbaObj,您要的服务是:” ;
Result += ServiceName;
Result += ―。您愿意为此服务付款吗?” ;
Result += FormatDateTime(―yyyy’年‘ m’月‘ d’日‘ h’点‘ m’分‘ s’秒
‘”,Now());
//返回响应数据
return Result.c_str();
? 上述代码完成了两件任务:编写服务日志及响应客户
请求。
? 用 C++ Builder编译最终实现代码
编写客户程序
? 客户程序向导生成一个客户程序框架
? 客户程序向导完成属性和对象引用的绑定,具体代码
如下:
CorbaObj_ptr __fastcall TForm1::GetcorbaObj(void)
{
if(FcorbaObj == NULL)
{
FcorbaObj = CorbaObj::_bind();
}
return FcorbaObj;
}
void __fastcall TForm1::SetcorbaObj(CorbaObj_ptr _ptr)
{
FcorbaObj = _ptr;
}
编写客户程序 (cont.)
? 在客户端添加一个, 发送, 按钮,编写实现代
码
//发送客户名称和服务名称
Memo1->Lines->Add(
corbaObj->TheResponse(
Edit1->Text.c_str(),
Edit2->Text.c_str()
)
);
? 用 C++ Builder编译最终实现代码
运行 CORBA程序
? 按一定的顺序启动应用程序
? 1.启动智能代理 VisiBroker Smart Agent
运行 CORBA应用程序之前,局域网内必须 至少有一
台主机上启动了智能代理 osagent。这是 VisiBroker
特有的分布式位置服务( location service)守护进
程,网络中多个智能代理可协作以查找合适的对象
实现。
? 2.在服务器端启动 CORBA服务器程序,也就
是 CORBA对象实现程序
? 3.在客户端启动 CORBA客户程序
运行 CORBA程序 (cont.)
? 服务器程序运行情况
运行 CORBA程序 (cont.)
? 客户端程序运行情况