`
pleasetojava
  • 浏览: 729581 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

跟我从头学TAO编程系列(3) -- 通过实例学习CORBA核心概念

阅读更多

跟我从头学TAO编程系列

通过实例学习CORBA核心概念

Stone Jiang 2005119@gmail.com

http://www.ace-tao.org

本系列的第一篇我们学会了怎么下载和编译ACE,TAO第二篇我们编写了最简单的TAO应用程序。学习CORBA,TAO与学习其它学科一样,一定要掌握其核心概念。这了节,我们通过第二篇的实例来学习CORBA的核心概念。

1.CORBA架构

CORBA的架构如下图:

image

2. CORBA核心概念

2.1 CORBA Object

CORBA对象是一个“虚拟”的实体。它可以被ORB定位和被客户端调用。在上一篇示例中,

interface Hello即为corba对象, 定义在Hello.idl中

//@file: Test.idl
//@author: StoneJiang<2005119@gmail.com>
//@ref : http://www.ace-tao.org

/// Put the interfaces in a module, to avoid global namespace pollution
module Test
{
/// A very simple interface
interface Hello
{
/// Return a simple string
string get_string ();

/// A method to shutdown the ORB
/**
* This method is used to simplify the test shutdown process
*/
oneway void shutdown ();
};
};

CORBA对象并不真实存在,它只存在于概念中。因此,CORBA对象需要程序员用编程语言把它实现。

2.2 client,object reference, request,stub

在本例在,client指client.exe。它是发起请求的程序。它的代码片如下

#include "TestC.h"

int
ACE_TMAIN(int argc, ACE_TCHAR *argv[])
{
CORBA::ORB_var orb = CORBA::ORB_init (argc, argv);

CORBA::Object_var tmp = orb->string_to_object("file://test.ior");

Test::Hello_var hello = Test::Hello::_narrow(tmp.in ());

CORBA::String_var the_string = hello->get_string ();

ACE_DEBUG ((LM_DEBUG, "(%P|%t) - string returned <%C>\n",
the_string.in ()));

return 0;
}

其中,对象引用(object reference,)此处是与字符串file://test.ior表示的;

发起的请求(request)为

CORBA::String_var the_string = hello->get_string ();

本例中的调用,采用的是static stub方式,与static stub相对的还有另一种调用方式DII,这里我们暂不讲述。我们可以把

TestC.h,TestC.cpp 文件视为 stub,它是由tao_idl.exe编译hello.idl时生成的文件。

2.2 target object, server, servant,,orb,poa

下面是HelloS.h的片断

class Hello;
typedef Hello *Hello_ptr;

class Hello
: public virtual PortableServer::ServantBase
{
protected:
Hello (void);

public:
// Useful for template programming.
typedef ::Test::Hello _stub_type;
typedef ::Test::Hello_ptr _stub_ptr_type;
typedef ::Test::Hello_var _stub_var_type;
Hello (const Hello& rhs);
virtual ~Hello (void);
::Test::Hello *_this (void);

virtual char * get_string (
void) = 0;
virtual void shutdown (
void) = 0;

};

其中, get_string()和shutdown()两个成员函数,被定义为纯虚函数(如果对纯虚函数的概念缺少了解,请参考C++相关知识),这也表示,类Hello是一个抽象类,必须由派生类重载这两个函数。这个派生类称为servant。在本例在,servant由Hello.h来定义,由Hello.cpp来实现。

下面是服务端的代码片断

#include "TestS.h"

/// Implement the Test::Hello interface
class Hello
: public virtual POA_Test::Hello
{
public:
/// Constructor
Hello (CORBA::ORB_ptr orb);

// = The skeleton methods
virtual char * get_string (void);

virtual void shutdown (void);

private:
/// Use an ORB reference to convert strings to objects and shutdown
/// the application.
CORBA::ORB_var orb_;
};

这里的文件TestS.h及TestS.cpp,也是由tao_idl.exe编译Hello.idl时生成的文件,这两个文件用于服务端,它就是skeleton。请参考CORBA构架图查看skeleton所在的位置。

#include "Hello.h"

int
ACE_TMAIN(int argc, ACE_TCHAR *argv[])
{
try
{
CORBA::ORB_var orb =
CORBA::ORB_init (argc, argv);

CORBA::Object_var poa_object =
orb->resolve_initial_references("RootPOA");

PortableServer::POA_var root_poa =
PortableServer::POA::_narrow (poa_object.in ());

if (CORBA::is_nil (root_poa.in ()))
ACE_ERROR_RETURN ((LM_ERROR,
" (%P|%t) Panic: nil RootPOA\n"),
1);

PortableServer::POAManager_var poa_manager = root_poa->the_POAManager ();
if (parse_args (argc, argv) != 0)
return 1;
poa_manager->activate ();

Hello *hello_impl = 0;
ACE_NEW_RETURN (hello_impl,
Hello (orb.in ()),
1);
PortableServer::ServantBase_var owner_transfer(hello_impl);

PortableServer::ObjectId_var id =
root_poa->activate_object (hello_impl);

CORBA::Object_var object = root_poa->id_to_reference (id.in ());

Test::Hello_var hello = Test::Hello::_narrow (object.in ());

CORBA::String_var ior = orb->object_to_string (hello.in ());

// Output the IOR to the <ior_output_file>
FILE *output_file= ACE_OS::fopen (ior_output_file, "w");
if (output_file == 0)
ACE_ERROR_RETURN ((LM_ERROR,
"Cannot open output file for writing IOR: %s\n",
ior_output_file),
1);
ACE_OS::fprintf (output_file, "%s", ior.in ());
ACE_OS::fclose (output_file);

ACE_DEBUG ((LM_DEBUG, "(%P|%t) server - wait for requsting from client.\n"));

orb->run ();

ACE_DEBUG ((LM_DEBUG, "(%P|%t) server - event loop finished\n"));

root_poa->destroy (1, 1);

orb->destroy ();
}
catch (const CORBA::Exception& ex)
{
ex._tao_print_exception ("Exception caught:");
return 1;
}

return 0;
}

服务端的执行过程如下 (用颜色来对应代码)

1) 初始化orb

2) 解析poa

3) 获得poa管理器,并激活它。 poa是主动对象(有关主动对象,请参考ACE_Task以及POSA),它相当于在自己的线程在运行。

4) 创建corba对象的servant

5) 用poa激活corba对象

6) 将corba对象的引用字符串化,并保存在磁盘上,供客户端使用。

7) 运行orb的事件循环,等待客户端的连接

8) 结束事件循环后,销毁poa以及orb

orb由 函数CORBA::ORB_init ()通过命令行参数初始化而得,客户端与服务端都需要调用这个函数来初始化orb。orb在corba框架图在的最下面,是它完成了具体的网络连接的建立,以及请求/应答数据包在网络在的传输。

poa对可移植的对象实配器,它是corba对象的管理者,corba 对象的创建,激活、生命期的管理,将客户端的请求分发给servant 来实响应都是由poa来完成的。

3. 结束语

本节我们对corba中的概念作了介绍,特别地我们将概念与代码作了对应。欲更具体地了解CORBA概念请参考《Advanced CORBA Programming with C++》的第二章第4节。

在示例在,客户端需要访问磁盘文件file://test.ior文件来初始化对象,并且此对象的引用是暂时的,每次重启服务端后,test.ior文件就失效了。接下来,我们讲一起学习POA,来开发更强大的服务端,敬请关注。

有任何问题,请来邮件 2005119@gmail.com或在bbs (http://www.ace-tao.org/bbs)上留言。

分享到:
评论

相关推荐

    corba核心规范-- 一个简单的CORBA/Java示例

    通过学习和实践这样的例子,我们可以深入理解CORBA的核心概念和工作原理,从而在更复杂的分布式系统中灵活应用。对于需要构建跨平台、跨语言的大型分布式系统的IT专业人士来说,掌握CORBA是一项重要的技能。

    基于TAO的CORBA编程详细介绍.rar

    "5_Hello World - 简单实例"是每个编程教程的传统起点,通过一个简单的程序展示了如何使用TAO实现CORBA的客户端和服务端通信。这个例子有助于初学者快速理解CORBA的基本工作流程。 **6. 使用命名服务** "6_Naming ...

    CORBA技术系列丛书之-CORBA服务

    CORBA技术系列丛书之"CORBA服务"着重于深入探讨这一技术的核心服务和应用,旨在为开发者提供全面的指导。 在CORBA系统中,服务是指一组预定义的接口和行为,它们为其他对象或对象服务提供通用功能,如命名服务、...

    corba实例

    CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是一种...总之,"corba实例"是一个学习和实践CORBA技术的好资源,通过实际操作,你可以更直观地掌握分布式对象通信的核心概念和技术。

    TAO CORBA CPP 编程指南 C++

    【TAO CORBA CPP 编程指南 C++】是一份详细介绍如何使用TAO(The ACE ORB)在C++环境中进行CORBA编程的文档。TAO是由美国华盛顿大学的Douglas C. Schmidt教授领导开发的实时CORBA平台,它是一个遵循CORBA 2.6规范的...

    CORBA-HelloWorld.rar_corba

    CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是一种中间件技术,它允许在分布式计算环境中不同操作系统和编程语言之间进行通信。在这个"Java实现的CORBA接口版HelloWorld"示例中...

    Corba学习实例文档

    在本Corba学习实例文档中,我们将探讨Java中如何使用CORBA(Common Object Request Broker Architecture)来实现跨网络的对象通信。CORBA是一种标准,允许不同操作系统、编程语言和网络环境中的对象相互协作,仿佛...

    java-Corba编程技术

    A (Common Object Request Broker Architecture,公共对象请求代理架构) 是一种开放标准,由 OMG(对象管理组)制定,用于实现跨平台、跨语言的...通过理解这个例子,开发者可以更好地理解和掌握CORBA编程的核心概念。

    《CORBA Programming with TAO》

    《CORBA Programming with TAO》是一篇专门为CORBA编程初学者准备的文章,它详细介绍了如何使用TAO(The ACE ORB)这一实现CORBA标准的开源ORB(对象请求代理)。TAO是ACE(Adaptive Communication Environment)...

    corba编程手册-必读

    综上所述,通过学习这些文档,开发者可以全面掌握使用C语言进行CORBA编程的技术细节,包括但不限于创建和使用CORBA接口,理解ORBit在GNOME中的作用,以及在实际开发中如何优化和调试代码。这不仅有助于提高开发效率...

    CORBA技术及实例

    通过对CORBA的基本概念和技术的深入理解,开发人员可以利用它来构建复杂的应用程序,实现不同系统间的无缝通信。上述实践案例展示了CORBA在实际开发中的应用流程,有助于加深对这一技术的理解和掌握。

    CORBA-sample-of-java.rar_corba

    在“CORBA-sample-of-java.rar_corba”这个压缩包中,包含了一个基于Java实现的CORBA实例,以及一个名为“基于Java的CORBA实验参考.mht”的文档,用于指导如何编译和运行这个程序。 **CORBA的核心概念** 1. **ORB...

    TAO CORBA CPP 入门-stone编写的文档(word版)

    在深入学习TAO CORBA C++编程时,你需要理解ORB的工作原理,掌握IDL的使用,编写客户端和服务端代码,以及如何发布和查找对象。此外,熟悉GIOP和IIOP(Internet Inter-ORB Protocol)协议对于理解ORB间的通信至关...

    corba中文版学习手册

    首先,我们需要了解CORBA的核心概念: 1. 对象模型:CORBA使用接口定义语言(IDL)来描述对象的接口,这些接口定义了对象可以被调用的操作和提供的服务。IDL是平台和语言无关的,使得不同编程语言实现的对象可以...

    基于C++CORBA高级编程(教材)

    通过深入学习和实践《基于C++ CORBA高级编程》这样的教材,开发者可以掌握如何在C++环境中利用CORBA设计和实现高性能、可扩展的分布式系统。书中的实例和指导将帮助读者理解并熟练运用这些技术,解决实际开发中的...

    CORBA编程课件-北邮龙湘明.rar

    **CORBA核心概念** 1. **ORB(Object Request Broker)**:对象请求代理是CORBA的核心组件,它负责对象间的通信。ORB解析对象引用,并将调用转换为网络消息,确保请求正确地发送到目标对象。 2. **IDL(Interface ...

    CORBA命名服务编程实例C++(SSD8Exercise5)

    **CORBA命名服务编程实例...总之,"CORBA命名服务编程实例C++(SSD8Exercise5)"是一个很好的学习资源,可以帮助开发者深入理解CORBA技术,并通过实际操作掌握其应用。通过解决实际问题,提升在分布式系统中的编程能力。

    corba中文版学习指南

    本指南将帮助你深入理解CORBA的核心概念和技术,从而更好地利用这一强大工具。 首先,我们要了解CORBA的基础知识。它是通过ORB(Object Request Broker,对象请求代理)实现的,ORB作为中间件,处理对象之间的通信...

    corba.tar.gz_CORBA TAO_TAO_corba

    3. **ACT (Advanced CORBA Tools)**: ACT通常是一系列工具和库,辅助开发者使用TAO进行CORBA开发,包括构建系统、测试框架等。 4. **C++**: TAO是用C++语言实现的,C++的面向对象特性使其成为实现复杂分布式系统的...

    corba ATM实例

    总之,这个"corba ATM实例"是一个很好的学习资源,它结合了分布式系统和银行业务的具体应用场景,使学习者能在实践中深入理解CORBA技术和对象分布式编程。通过分析和运行此实例,不仅能提升编程技能,也能增强对...

Global site tag (gtag.js) - Google Analytics