nullnull8 IIOPIIOP:Internet Inter-ORB Protocol
基于Internet的ORB间互操作
GIOP的一个实例
GIOP:General Inter-ORB ProtocolIIOPnull 内 容
GIOP设计目标
GIOP功能
CDR
GIOP消息格式
GIOP传输假定
IIOP消息传输IIOPnull最大可能范围的可用性
基于最广泛使用和灵活的通讯传输机制(TCP/IP)
并定义在ORB之间传输请求所需的其它协议
简单性
可扩展性
它们的大小接近或超过今天Internet的大小(1) GIOP设计目标IIOPnull低耗费
对现有的或新的ORB设计添加对GIOP/IIOP的支持
应该需要小量的
投资
一般性
IIOP开始是为TCP/IP定义的
GIOP设计为在其它面向连接的传输协议上实现
体系结构 中立性
GIOP将ORB看成体系结构未知的不透明实体。IIOPnull少量、简单消息
仅仅用七个消息格式
GIOP就可以支持ORB之间的全部CORBA功能
以及支持对象地点服务的 扩展功能
动态迁移 和
对通讯资源的有效管理
GIOP语义不要求格式或绑定协议
在大多数情况下
客户可以在打开连接后立即向对象发送请求
动态对象地点
许多ORB的体系结构
允许 在不同地点激活还没有过期的对象实现
并且 允许动态迁移对象
GIOP消息为对象地点和迁移提供支持
但在不需要或不适合ORB的体系结构时
不要求ORB实现这样的机制(2) GIOP功能IIOPnull完全的CORBA支持
GIOP消息直接支持CORBA要求的所有功能和行为
包括例外情况
、传送操作环境和远程对象引用操作
(例如CORBA::Object::get_interface)
GIOP支持传送特定于服务的环境
例如由事务服务定义的事务环境
该机制的设计目的是
支持要求在请求中隐式传送与服务相关环境的任何服务IIOPnull(3) 公共数据
示(CDR) CDR是传输语法
它将用OMG IDL定义的数据类型映射到
双向规范的低级表示
以便在代理之间进行传输
CDR有如下功能:
可变的字节次序
有公共字节次序的机器
可以在不进行字节交换的情况下进行消息交换
当与字节次序不同的机器进行通讯时
消息发起者决定消息字节次序
接收者负责交换字节以便匹配它的本地次序
每个GIOP消息(以及CDR封装)包含
指出正确字节次序的标记IIOPnull对齐的主类型
在GIOP消息内基本OMG IDL数据类型
在它们的自然边界对齐
这样强制在内存中进行数据对齐的体系结构
可以有效地处理它们
完整的OMG IDL映射
CDR描述所有OMG IDL数据类型
(包括可传输的伪对象,例如TypeCode)的表示
如果需要,CDR为CORBA Core规范中
表示未定义或与实现有关的数据类型定义表示方法IIOPnullmodule GIOP {
enum MsgType {
Request, Reply, CancelRequest,
LocateRequest, LocateReply,
CloseConnection, MessageError
};
struct MessageHeader {
char magic [4];
Version GIOP_version;
boolean byte_order;
octet message_type;
unsigned long message_size;
}; (4) GIOP 消息格式IIOPnull(5) GIOP 传输假定传输是面向连接的
GIOP使用连接来定义请求ID的作用域和范围
传输是可靠的
传输保证字节按发送时的次序至多传输一次
并且有一些传输的肯定确认
传输对错误的连接丢失提供一些合理的
如果对等进程失败、对等主机崩溃或者网络连接丢失
则连接所有者应该接收到这种情况的一些通知
初始化连接的传输模型可以映射到TCP/IP的一般连接模型
代理将已知的网络地址发布在IOR中
客户在初始化连接时使用它IIOPnull 服务器不主动初始化连接
但它准备接收对连接的请求
例如,它侦听TCP/IP terms的连接
其它知道地址的代理(称为客户)可以
尝试通过对地址发送connect请求来初始化连接
侦听的服务器可以 接受请求、与客户建立新的唯一连接
或者它可以拒绝请求
一旦连接打开后,两端都可以关闭连接
候选的传输协议可能不直接支持这种特定的连接模型
只有传输模型可以映射到该视图才是必要的IIOPnull(6) IIOPOMG为GIOP指定的基线传输协议是TCP/IP
用于支持TCP/IP的库的特定API可以不同
GIOP消息传输到TCP/IP的映射称为
Internet Inter-ORB协议(IIOP)IIOPnullmodule IIOP { // IDL
struct Version {
char major;
char minor;
};
struct ProfileBody {
Version iiop_version;
string host;
unsigned short port;
sequence
object_key;
};
};IIOP IORIIOPnull9 ORB 产品IONA 公司的Orbix
Inprise公司的visibroker
Digital公司的ObjectBroker
IBM公司的ComponentBroker
OOC公司的OminiBroker
Frankfurt 大学的MICOORB 产品nullIONA公司的Orbix 是目前市场占有率最高的ORB产品
已经在金融、电信等多个领域得到广泛应用
目前在 UNIX
Windows 95/NT
MVX等 多种操作系统上运行
对IDL的映射基本上包含了CORBA规范的内容
例如C++、Java、Ada、Cobol等
所实现的COS包括Naming Service、Event Service、
Transaction Service、Security Service、Event Service等
另外IONA公司还提供了ORB与DCOM的桥接产品:OrbixCOMet
以及完全用Java 实现的ORB:OrbixWeb
可以被WEB浏览器加载,增强WEB功能
网址:www.iona.comOrbixORB 产品nullVisibroker
1997年11月原Borland公司与Visigenic公司合并成立Inprise
原属于Visigenic公司的ORB产品Visibroker
成为Inprise的重要产品
并被集成到Delphi 4.0 中
Visibroker 对IDL的映射包括:C++、Java
所实现的COS包括Naming Service、Event Service等
Visibroker已经被集成到Netscape 的Communicator中
在其它嵌入式系统中也有所应用
网址:www.inprise.comORB 产品nullObjectBroker
这是中间件厂商BEA公司从Digital公司获得的ORB产品
已经被集成到BEA的其它环境之中
主要完成了向C++的映射
所实现的COS包括 Naming Service
Event Service
Transaction Service等
M3是BEA的一个集ORB、COS等功能于一身的产品
网址:www.beasys.comORB 产品nullComponentBroker
IBM公司的ORB增强产品
IBM最初曾提出兼容CORBA规范的DSOM模型
随着CORBA规范的逐步完善
IBM将模型中与ORB直接相关的部分抽取出来
称之为ComponentBroker
ComponentBroker完成的IDL映射包括 C++
Java
Smalltalk
COBOL等语言
所实现的COS包括Naming Service
Event Service
Transaction Service
Concurrent Services等
网址:www.software.ibm.comORB 产品nullOB
美国OOC公司开发ORB产品──OB(OmniBroker)
最初是完全free的
其所有源代码皆可以自由下载
完成的IDL包括C++、Java
OB所实现的COS包括Naming Service、Event Service等
1998年开始,OOC以OB为核心实现了商业ORB产品:Orbacus
所实现的COS增加了Trading Service、Security Service等
网址:www.ooc.comORB 产品nullMICO
德国Frankfurt大学开发的ORB产品──MICO(Mico Is COrba)
所完成的IDL包括C++、Java
所实现的COS包括Naming Service
Event Service
Security Service等
自2.0开始,MICO的版本号与CORBA的正式版本号同步
目前为2.31版
MICO是为教育目的而开发的
并且采用了与Linux类似的发展途径
版权归GNU组织
因而具有较好的发展前景
网址:www.vsb.cs.uni-frankfurt.de/~mico/ORB 产品nullClient developerServer developer
ServerIDL
compilerIDL
compilerClientIDL 10 CORBA应用程序开发过程开发过程例子 - Grid Object例子 - Grid ObjectGrid objectserverremote calls123581321345589144233width
height
get(row,col)
set(row,col,value)client开发过程Step-by-StepStep-by-Step Define the IDL interface
Compile the IDL interface
Write a client
Implement the interface
Write a server mainline
Register the server开发过程An IDL InterfaceAn IDL Interfaceinterface Grid {
readonly attribute short height;
readonly attribute short width;
void set(in short row, in short col, in long value);
long get(in short row, in short col);
};
开发过程编译成 C++:编译成 C++:ORB client
libraryORB server
librarygridS.cc
server skeletongridC.cc
client stubsClientServergrid.hh
common
declarationsgrid.idl开发过程IDL to C++ 映射IDL to C++ 映射 IDL operations (操作)映射为 C++ 的成员函数
- parameter types 映射为 C++ types
IDL attributes (属性)映射为 C++的成员函数
- 一个用于获取值
- 另一个用于设置值 (如果不是只读属性)
IDL data types 映射为 C++ data types
一 个 interface 映射为一个 C++ class.开发过程所产生的 C++ code:所产生的 C++ code:class Grid : public virtual CORBA::Object {
public:
static Grid_ptr _bind(....);
virtual CORBA::Short height(CORBA::Environment&);
virtual CORBA::Short width(CORBA::Environment&);
virtual void set(CORBA::Short row, CORBA::Short col,
CORBA::Long value, CORBA::Environment &);
virtual CORBA::Long get(CORBA::Short row,
CORBA::Short col,
CORBA::Environment &);
};开发过程Writing a ClientWriting a Client#include “grid.hh”
#include
main () {
Grid_var p; // Like a C++ pointer
// Connect to a remote Grid object
p = Grid::_bind(“myGrid:GridSrv”, GridHost);
// Now use it like a regular C++ object
cout << “height is “ << p->height() << endl;
cout << “width is “ << p->width() << endl;
p->set(2,4,123); // a remote call
cout << “grid[2,4] is “ << p->get(2,4) << endl;
};开发过程如何工作?如何工作?Grid implementationserverremote
CORBA callsclientC++ callsGrid proxy -
a local C++ object开发过程Implementing the InterfaceImplementing the Interface 编写一个 C++ class
继承 ORB functionality
加入数据成员以及其它 C++ 函数
- 根据具体的需求
重定义 IDL 函数
- 提供具体的功能
开发过程Grid implementationGrid implementation// Define a C++ implementation class Grid_i
// Inherit distributed capability
#include ”grid.hh”
class Grid_i: public virtual GridBOAImpl
{
// Add application data and functions
short m_height, m_width;
long **m_array;
public:
Grid_i(short h, short w); // Constructor
virtual ~Grid_i(); // Destructor开发过程Grid_i 还包括...Grid_i 还包括... // Re-define the IDL functions
virtual CORBA::Short height(CORBA::Environment&);
virtual CORBA::Short width(CORBA::Environment&);
virtual void set(CORBA::Short row,
CORBA::Short col,
CORBA::Long value,
CORBA::Environment&);
virtual CORBA::Long get(CORBA::Short row,
CORBA::Short col,
CORBA::Environment&);
};开发过程 IDL 具体功能 IDL 具体功能 virtual CORBA::Short Grid_i::width(CORBA::Environment &)
{ return m_width; }
virtual CORBA::Short Grid_i::height(CORBA::Environment &)
{ return m_height;}
virtual void Grid_i::set
(CORBA::Short row, CORBA::Short col,
CORBA::Long value, CORBA::Environment&);
{ m_array[row][col] = value; }
CORBA::Long Grid_i::get
(short row, short col, CORBA::Environment &)
{ return m_array[row][col]; }开发过程什么是 ‘server mainline’?什么是 ‘server mainline’? server 是 objects的 容 器
- ORB 能激活的可执行代码
‘server mainline’
- 在server中创建初始对象
- 将控制权交给 ORB 以等待调用。
各个对象分别实现自己的功能
- ORB 将接受到的调用分发给具体的对象。开发过程编写 server mainline编写 server mainline#include “grid_i.h”
#include
main() {
// Create some initial objects
// (only one in this case)
Grid_i myGrid(100,100);
try {
//Give control to the ORB
CORBA::Orbix.impl_is_ready();
} catch { .... }
cout << “Server terminating” << endl;
}开发过程Registering the serverRegistering the server Servers 可以由 ORB 自动启动
- 响应客户请求
注册过程告诉 ORB:
- 哪个可执行代码是服务器
- 服务器的激活模式
- 安全等功能
存在多种激活模式
- 共享服务器,独享服务器等开发过程编程小结编程小结 从 IDL起步
- client 与 server 间的契约
编写Client 与 server 代码
- ORB 支持的代码是从 IDL产生的。ORB 负责对象的分布,用户可以将精
力放在具体应用程序的功能上,而不
是实现技术上。开发过程CORBA小结CORBA小结1、OMG与CORBA
2、CORBA对象模型
3、CORBA概述
4、IDL
5、ORB接口
6、IR
7、POA
8、IIOP
9、ORB产品
10、开发过程其他相关问题其他相关问题CCM:CORBA Component Model
CORBA /COM interworking
CORBA Common Object Service
...