CORBA_Programming_with_TAO
CORBA和Tao的语法规则
CORBA和Tao的语法规则1)注意,在IDL当中定义的数据类型和C++当中的数据类型有一个映射关系,它并不会直接使用在IDL当中所定义的类型。
2)简单的基本类型TAO支持的IDL数据类型及其C++ Mapping关系,TAO支持以下简单基本数据类型(%TAO_ROOT%/tao/Basic_Types.h):以上各简单基本类型对应的C++类型只是对应平台上基本类型的typedef。
为了保证程序的可移植性,应该总是使用CORBA命名空间中的类型标识。
没有我们熟悉的C++基本类型byte(被Octet取代)、int(被Long取代)。
3)复杂的基本类型(Tao说支持的数据类型)4)应该总是使用TAO提供的(也是CORBA规范规定的)如下字符串操作函数:char * string_alloc(ULong len);char * string_dup(const char *);void string_free(char *);WChar * wstring_alloc(ULong len);WChar * wstring_dup(const WChar *);void wstring_free(WChar *);(w)string_alloc/(w)string_dup后必须调用(w)string_free来释放分配的资源,为了避免忘记(w)string_free带来的麻烦,有些情况下,我们可以考虑使用String_var类型。
String_var 是String类对应的智能指针类,除了TAO本身支持的智能指针类型外,tao_idl在生成代码时会自动为每个Object添加一个对应的var类型)。
5)具体的字符串函数的使用:●(w)string_alloc(n)会分配n+1个字符(不是字节)空间举例:#include<tao/corba.h>#include<iostream>using namespace std;int main() {char * p = CORBA::string_alloc(5); // Allocates 6 bytesstrcpy(p, "Hello"); // OK, "Hello" fitscout << p << endl;CORBA::string_free(p);CORBA::String_var s = CORBA::string_dup("World");cout << s.in() << endl;return 0;}●CORBA::Any可以在其中存入任意其他类型的数据,我们可以通过<=操作符来向Any类型变量写入信息,而通过>=操作符从Any变量中读出信息,由于重载的>=操作符返回的是一个表示转换成功或者失败的标志,我们总是使用if...else来对解析结果进行判断。
CORBA实验2.1
编译后将在Bank子目录中形成以下两组共14个文件:
Account.java
AccountOperations.java
AccountHelper.java
AccountHolder.java
AccountPOA.java
AccountPOATie.java
_AccountStub.java
●编写IDL接口定义文件;
●将接口定义文件编译为相应高级语言源代码,产生服务器框架与客户端存根;
●基于服务器框架,编写服务对象实现程序;
●基于客户端存根,编写客户对象调用程序;
●分别编译客户对象和服务对象程序;
●运行服务对象和客户对象程序;
CORBA实例分析
下面通过一个实例,描述如何通过Java创建CORBA应用程序。
·??创建Java对象并使之可在CORBA ORB中展开,
·??创建Java类并作为和其它ORB一起展开的CORBA对象的客户。这种方法提供了另外一种途径,通过它Java可以被用于将你的新的应用和以前遗留的系统相集。
采用Java创建CORBA应用
CORBA对象服务的实现方式分为两种:对象的命名引用方式和字符串化对象引用方式。不论采用何种高级语言,创建CORBA应用程序的过程大体如下:
与RMI相比,CORBA是为更大、可伸缩更强的系统准备的,在这些系统中可能有数千个对象;CORBA的编程和部署比RMI更复杂,但允程序员开发需要事务、安全性等支持的企业级系统;CORBA的命名服务也比RMI命名注册功能更强大和灵活。
CORBA的实现称为ORB(Object Request Broker,对象请求代理)。Java IDL即是CORBA的一个实现,它是JDK1.3或更高版本的核心软件包之一,定义在org.omg.CORBA及其子包中。在Java IDL的支持下,开发人员可以使用如下两种方法将Java和CORBA集成在一起:
CORBA编程
广东技术师范学院实验报告实验名称: CORBA编程一、实验目的:1、体验分布式对形象CORBA的开发2、学习CORBA的部署部署与运行方法二、实验内容1、确定应用对象,定义它们在IDL中的接口2、将IDL定义编译成Java的存根和骨架3、声明和实现能具体化CORBA对象的伺服器4、编写一个服务器的主程序5、与生成的存根和骨架一起编写、编译和链接服务器应用程序6、编写一个客户端的主程序7、与生成的存根一起编写、编译和链接成客户应用程序三、实验步骤:(说明代码及运行结果)代码:1、接口定义(Multiply.idl)module MultiplyApp{interface Multiply{long MultiplyNum(in long num1,in long num2);};};2、接口实现(MultiplyImpl.java)import org.omg.CORBA.*;import MultiplyApp.MultiplyPOA;public class MultiplyImpl extends MultiplyPOA{private ORB orb;public void setORB(ORB orb_val){orb = orb_val;}/* 实现接口声明方法MultiplyNum */public int MultiplyNum(int num1,int num2){System.out.println("我在CORBA的服务器端,客户端正在调用'MultiplyNum'方法,相乘的结果是:");return num1*num2;}}3、服务器(MServer.java)import MultiplyApp.*;import org.omg.CosNaming.*;import org.omg.CORBA.*;import org.omg.PortableServer.*;import org.omg.PortableServer.POA;public class MServer {public static void main(String args[]) {try {/* 创建和初始化ORB */ORB orb = ORB.init(args, null);/* 获取对RootPOA的引用,启动POAManager */POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));rootpoa.the_POAManager().activate();/* 创建一个实例并将其向ORB 注册*/MultiplyImpl h = new MultiplyImpl();h.setORB(orb);System.out.println("将实例注册到ORB ");/* 获取对服务端的对象引用*/org.omg.CORBA.Object ref = rootpoa.servant_to_reference(h);Multiply href = MultiplyHelper.narrow(ref);/* 从名称服务中获取根元素名称上下文*/org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);/* 在Multiply名称下注册新对象*/String name = "Multiply";NameComponent path[] = ncRef.to_name(name);ncRef.rebind(path, href);/* 等待客户端的调用。
基于TAO(The ACE ORB)的CORBA编程
CORBA Programming with TAO - 1.Start(基本概念)摘要:简要介绍CORBA的基本原理,并解释POA、stub、skeleton、servant等重要概念。
一、CORBA及TAO简介CORBA是一个为简化跨平台应用而提出的规范,它独立于网络协议、编程语言和软硬件平台,支持异构的分布式计算环境和不同编程语言间的对象重用。
CORBA可以作为不同平台应用间信息传递的中间件,CORBA通过引入经过充分验证的有效的框架结构和通信手段,最大限度地简化了网络通信相关应用的设计与开发,使得我们可以专注于业务逻辑的实现,而无需关心通信的细节。
CORBA曾在无数文章中被称作“软总线”,以表明它作为数据传递通道的基本特性。
现在存在众多CORBA实现,既有商用的ORBacus、VisiBroker,也有一些优秀的开源实现,如:TAO、omniORB、MICO等。
由于各实现遵从相同的规范,接口基本一致,所以在熟练应用一种CORBA实现后,转而使用其它实现时,一般不会存在太大的障碍。
TAO(The ACE ORB)是美国华盛顿大学的Douglas C. Schmidt教授领导开发的一个实时CORBA平台,它是一个免费的开放源码项目,用C++语言开发,符合CORBA2.6规范。
支持语言: C++支持平台: Win32,常见的各种Unix/Linux,实时操作系统如VxWorks等等。
在所有的CORBA实现中,TAO 支持的平台是最多的。
支持的服务: Naming、Event、Notification、Security、Time、Scheduling、Logging、Lifecycle、Trading、Concurrency、Lifecycle、A/V Streaming、Load balancing等。
本系列文章将以当前最新的ACE-5.5+TAO-1.5+CIAO0.5为例,简要介绍如何应用TAO进行CORBA C++编程,其中部分内容(尤其是编译器配置相关的内容)是Windows平台特有的,但其它大多数信息在各平台上都是相同或者类似的。
CORBA编程
CORBA::ORB_var orb=CORBA::ORB_init (argc, argv); // Find the Naming Service CORBA::Object_var NamingObj=orbNamingObj=orb>resolve_initial_references("NameService"); cout<<"Initialize NameService...OK"<<endl; CosNaming::NamingContext_var root=CosNaming::NamingContext::_narrow(NamingObj.in( )); if(CORBA::is_nil(root.in())) { cerr<<"Nil Naming Context reference"<<endl; return 1; } // Get reference to Root POA CORBA::Object_var RootObj=orbRootObj=orb>resolve_initial_references("RootPOA"); PortableServer::POA_var poa=PortableServer::POA::_narrow(RootObj.in()); cout<<"Create RootPOA...OK"<<endl;
CORBA简介 CORBA简介
语言映射 IDL (Interface Description Language) 是 一种说明对象接口的语言。可以将IDL映射成不 一种说明对象接口的语言。可以将IDL映射成不 同的语言,例如:可以映射成C++代码,JAVA 同的语言,例如:可以映射成C++代码,JAVA C++ 代码等。 对象调用示意图
Corba-omniORB简单编程-IOR
Corba-omniORB简单编程—IORLiuxuezongCORBA是一个完全中间性的语言,CORBA 专门确保让我们不必担心客户机环境和服务器环境之间的差异。
可以使用接口定义语言(IDL)定义开发时使用接口的 Client 和实现接口的 Server 所需要的信息。
Client 和 Server 的具体实现代码并不在IDL定义中编写,而是使用某种目标语言的IDL 编译器生成所需的代码存根及helper类,Client 和 Server 再使用真正的编程语言来进行具体实现。
为了保证在不同的 CORBA 产品基础之上构建的分布式对象可以相互通信,Client和Server通过ORB(对象请求代理)进行通信。
一般的运行流程是Client把请求发送给ORB,ORB再把请求发送给Server,Server把返回结果发送ORB,ORB再把返回结果发送给Client。
ORB可以说Client和Server之间的翻译者。
即使Client和Server使用不同的编程语言编写,只要是符合相同的IDL定义,ORB也可以完成相互的通信。
一、下载Corba-omniorb开源代码首先到/下载一个win32的OmniORB。
文件名为“omniORB-4.1.1-x86_win32_vc6.zip”。
然后解压缩至文件夹“D:\omniORB-4.1.1”。
二、设置环境变量1)、将“D:\omniORB-4.1.1\bin\x86_win32;”加入到系统环境变量path中;2)、设置用户环境变量“OMNI_ROOT= D:\omniORB-4.1.1”。
三、编辑IDL文件使用记事本写一个time.idl文件,idl文件定义了的Time接口,其中包含一个get_gmt()方法。
文件内容如下:interface Time{short get_gmt();};四、编译IDL文件在cmd中对idl进行编译:进入time.idl文件所在目录,使用omniidl -bcxx time.idl 对time.idl进行编译。
corba协议-概述说明以及解释
corba协议-概述说明以及解释1.引言1.1 概述Corba(Common Object Request Broker Architecture)是一种面向对象的分布式计算的标准化协议。
它定义了一套标准化的通信协议,使得不同的对象能够在网络上进行通信和交互。
Corba协议通过对象请求代理(ORB)实现对象之间的通信,使得对象在不同的计算机上可以相互调用,实现分布式计算。
该协议被广泛应用于企业级软件系统中,能够提高系统的可扩展性、可维护性和灵活性,为分布式系统的开发提供了良好的支持。
在本文中,我们将介绍Corba协议的基本原理、特点和应用领域,以便更好地理解和使用这一重要的分布式计算协议。
1.2文章结构1.2 文章结构本文将首先介绍Corba协议的概念和背景,包括其起源、发展历程和基本原理。
接着将详细探讨Corba协议的特点,包括其跨平台、语言中立和分布式的优势。
然后将深入分析Corba协议在各个应用领域的具体应用,包括企业级系统、网络通信和物联网等方面。
最后对Corba协议的发展前景进行展望,探讨其在未来的发展趋势和潜在挑战。
通过本文的阐述,读者将能够全面了解Corba协议的重要性和应用领域,以及对其发展方向有更深入的认识。
1.3 目的本文的主要目的是介绍和探讨Corba(通用对象请求代理结构)协议,旨在帮助读者了解该协议的基本概念、特点和应用领域。
通过对Corba协议的介绍,读者可以深入了解面向对象技术在分布式系统中的应用,以及Corba协议在不同领域中的实际应用情况。
同时,本文也将分析Corba 协议的优势和局限性,以及未来在分布式计算领域的发展趋势。
通过本文的阐述,读者将能够更好地理解和应用Corba协议,为其在实际项目中的应用提供参考和指导。
2.正文2.1 Corba协议介绍CORBA(Common Object Request Broker Architecture)是一种用于分布式系统中对象通信的协议。
CORBA原理简介与实例
CORBA 原理简介与实例CORBA 核心总体设计规划基于服务的ORB遵循公共ORB 体系结构,可以有很多ORB 的具体实现,比如客户和实现驻留ORB ,基于服务的ORB ,基于系统的ORB 以及基于链接库的ORB 等。
考虑到我们今后利用本平台所作开发项目的具体情况以及我们目前的开发条件与能力,决定选用基于服务的ORB 为开发目标。
这种基于服务的ORB ,对ORB 进行集中式管理,所有的客户实现均可以与一个或多个服务器进行通信,这些服务器的功能是将请求从客户端发送到实现端。
这样的话,ORB 就可以做成一个普通的程序,以便运行在不同的平台上。
总体结构本系统所采用的实现方法为:客户通过动态调用接口和ORB 接口经ORB 核心与具体的对象实现进行交互。
具体结构如下图所示:参照CORBA 2.3规范,本系统工作原理如下:客户首先通过ORB 核心提供的ORB 接口得到一个对象引用。
至于得到一个什么样的对象引用,取决于客户需要的服务。
通常每个服务都会有一个标识,客户就是通过这个标识来识别每一个服务的。
也就是说,客户首先要向ORB 核心提交一个服务标识来请求一种服务。
ORB 核心在得到客户提供的服务标识之后,从它掌握的各个对象适配器(POA )中处于活跃状态的对象实现(服务提供者)中挑选一个。
本系统中,ORB 核心是通过查询一个POA 、对象实现(服务标识)列表来完成这一功能的。
这样的话,ORB 核心返回给客户的对象引用具体地说就是该服务与POA 对在本核心所用于所有ORB 实现的同一接口可能有多个对象适配器上调用 下调用总体结构图持有列表中的位置。
ORB核心又是怎么得到并维护这个POA与服务标识的列表的呢?这个列表的创建与修改都是通过POA来完成的,因为与对象实现(服务提供者)直接交互的是POA,而不是ORB核心。
对于服务是否可用的状态维护,本系统考虑了两种情况:一是ORB先于对象实现而运行;二是对象实现先于ORB而运行。
CORBA核心服务
事件服务
服务端
4)调用SupplierAdmin对象的obtain_push_consumer()方法,得到一 个ProxyPushConsumer对象。 5)创建1)中的Supplier的实现类的一个实例。在上面4)得到的 ProxyPushConsumer对象上调用connect_push_supplier()方法,把 Supplier的实现类的实例传给此方法。 6)现在Server侧已经连接到Event Channel,可以调用 ProxyPushConsumer对象的push()方法来发送事件通知给Channel了。
$nmg $dior
命名服务
// get a reference to the naming service ORB orb = ORB.init(args, null); org.omg.CORBA.Object o = orb.resolve_initial_references("NameService") NamingContextExt nc = NamingContextExtHelper.narrow( o ); // look up an object server s =
事件服务
服务端
1)创建一个类,继承自PushSupplierPOA,这个类就是Server侧的 Supplier的实现类。 2)创建一个org.jacorb.events.EventChannelImpl 的对象,它实现了 EventChannel的接口。然后向NameService注册这个Channel,注册时 提供一个Channel名。 3)调用EventChannelImpl对象的for_suppliers()方法,得到一个 SupplierAdmin对象。
corba_java
CORBA 程序设计指南(入门)Author: 龙湘明Company: 北京邮电大学国家重点实验室Date : 2001-2-28Update : 2013-09-10这里假设你对CORBA毫无所知。
对JAVA略有所知,因为这里使用JAVA作为程序设计语言。
学习了本书,你将对CORBA有个初步了解,并能编写一个简单完整的CORBA 应用程序。
1.C ORBA 简介CORBA(Common Object Request Broker Architecture)是为了实现分布式计算而引入的。
为了说明CORBA在分布计算上有何特点,我们从它与其它几种分布计算技术的比较中进行说明。
与过去的面向过程的RPC(Remote Procedure Call)不同,CORBA是基于面向对象技术的,它能解决远程对象之间的互操作问题。
MicroSoft 的DCOM (Distributed Component Object Model)也是解决这一问题的, 但它基于Windows操作系统,尽管到本书编写时,DCOM已有在其他操作系统如Sun Solaris, Digital Unix, IBM MVS 上的实现,但毫无疑问,只有在微软的操作系统上才会实现得更好。
而只有CORBA是真正跨平台的,平台独立性正是CORBA的初衷之一。
另一种做到平台无关性的技术是Java RMI(Remote Method Invocation),但它只能用JAVA实现。
CORBA与此不同,它通过一种叫IDL(Interface Definition Language)的接口定义语言,能做到语言无关,也就是说,任何语言都能制作CORBA组件,而CORBA组件能在任何语言下使用。
因此,可以这样理解CORBA:CORBA一种异构平台下的语言无关的对象互操作模型。
1.1 CORBA体系结构CORBA的体系结构如下:图1.1 CORBA体系结构CORBA上的服务用IDL描述,IDL将被映射为某种程序设计语言如C++或Java,并且分成两分,在客户方叫IDL Stub(桩), 在服务器方叫IDL Skeleton(骨架)。
一个简单的CORBA例子
⼀个简单的CORBA例⼦因为对CORBA分析的需要,这⾥写⼀个简单的CORBA例⼦。
从JDK1.2开始,JDK中集成了ORB的实现,本例⼦使⽤了JDK1.7,对于JDK1.2+应该都没有问题。
这个例⼦实现⼀个简单的加减乘除的功能的计算器,客户端将参数和请求的⽅法名传送到服务端,服务端处理这个请求并将结果返回给客户端。
我们知道不同编程语⾔中的类型的表达,内存模型是不⼀样的,为此CORBA发明了⼀套中间描述语⾔IDL,不同语⾔平台的ORB实现负责将IDL中的类型映射到本地类型中。
因此IDL是我们编写CORBA程序的出发点,⾸先,我们⽤IDL来描述我们的接⼝/对象:1 module com{2 module bes{3 module corba{4 module test{5interface Calc{6void add(in long a,in long b,out long c);7void sub(in long a,in long b,out long c);8void multi(in long a,in long b,out long c);9void div(in long a,in long b,out long c);11 };12 };13 };14 };15 };当然接⼝Calc中的⽅法的返回值不⼀定为void,这⾥将返回值放到了out类型的参数c中,⽅法可以带有多个out类型的参数。
然后我们⽤idlj ⼯具(jdk⾃带)将Calc.idl转换为对应java的描述,并⽣成Stub和POA等类:idlj给我们⽣成很多⽂件,⾸先我们来看⼀下UML图:上⾯的图不涉及⼯具类CalcHelper和CalcHolder,这两个类的作⽤在后⽽阐述。
package com.bes.corba.test;/*** com/bes/corba/test/_CalcStub.java .* 由IDL-to-Java 编译器 (可移植), 版本 "3.2"⽣成* 从Hello.idl* 2016年2⽉15⽇星期⼀下午09时08分34秒 CST*/public class _CalcStub extends org.omg.CORBA.portable.ObjectImpl implements com.bes.corba.test.Calc{public void add (int a, int b, org.omg.CORBA.IntHolder c){org.omg.CORBA.portable.InputStream $in = null;try {org.omg.CORBA.portable.OutputStream $out = _request ("add", true);$out.write_long (a);$out.write_long (b);$in = _invoke ($out);c.value = $in.read_long ();return;} catch (org.omg.CORBA.portable.ApplicationException $ex) {$in = $ex.getInputStream ();String _id = $ex.getId ();throw new org.omg.CORBA.MARSHAL (_id);} catch (org.omg.CORBA.portable.RemarshalException $rm) {add (a, b, c );} finally {_releaseReply ($in);}} // addpublic void sub (int a, int b, org.omg.CORBA.IntHolder c){org.omg.CORBA.portable.InputStream $in = null;try {org.omg.CORBA.portable.OutputStream $out = _request ("sub", true);$out.write_long (a);$out.write_long (b);$in = _invoke ($out);c.value = $in.read_long ();return;} catch (org.omg.CORBA.portable.ApplicationException $ex) {$in = $ex.getInputStream ();String _id = $ex.getId ();throw new org.omg.CORBA.MARSHAL (_id);} catch (org.omg.CORBA.portable.RemarshalException $rm) {sub (a, b, c );} finally {_releaseReply ($in);}} // subpublic void multi (int a, int b, org.omg.CORBA.IntHolder c){org.omg.CORBA.portable.InputStream $in = null;try {org.omg.CORBA.portable.OutputStream $out = _request ("multi", true);$out.write_long (a);$out.write_long (b);$in = _invoke ($out);c.value = $in.read_long ();return;} catch (org.omg.CORBA.portable.ApplicationException $ex) {$in = $ex.getInputStream ();String _id = $ex.getId ();throw new org.omg.CORBA.MARSHAL (_id);} catch (org.omg.CORBA.portable.RemarshalException $rm) {multi (a, b, c );} finally {_releaseReply ($in);}} // multipublic void div (int a, int b, org.omg.CORBA.IntHolder c){org.omg.CORBA.portable.InputStream $in = null;try {org.omg.CORBA.portable.OutputStream $out = _request ("div", true);$out.write_long (a);$out.write_long (b);$in = _invoke ($out);c.value = $in.read_long ();return;} catch (org.omg.CORBA.portable.ApplicationException $ex) {$in = $ex.getInputStream ();String _id = $ex.getId ();throw new org.omg.CORBA.MARSHAL (_id);} catch (org.omg.CORBA.portable.RemarshalException $rm) {div (a, b, c );} finally {_releaseReply ($in);}} // div// Type-specific CORBA::Object operationsprivate static String[] __ids = {"IDL:com/bes/corba/test/Calc:1.0"};public String[] _ids (){return (String[])__ids.clone ();}private void readObject (java.io.ObjectInputStream s) throws java.io.IOException{String str = s.readUTF ();String[] args = null;java.util.Properties props = null;org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);try {org.omg.CORBA.Object obj = orb.string_to_object (str);org.omg.CORBA.portable.Delegate delegate = ((org.omg.CORBA.portable.ObjectImpl) obj)._get_delegate (); _set_delegate (delegate);} finally {orb.destroy() ;}}private void writeObject (java.io.ObjectOutputStream s) throws java.io.IOException{String[] args = null;java.util.Properties props = null;org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init (args, props);try {String str = orb.object_to_string (this);s.writeUTF (str);} finally {orb.destroy() ;}}} // class _CalcStub_CalcStub是存根类,有过远程调⽤编程经验的读者应该对这个词⽐较熟悉,它是远程对象在本地的⼀个代理(Proxy)。
CORBA应用程序开发过程
CORBA应用程序开发过程下面是CORBA应用程序开发的基本过程:1.需求分析:和其他软件开发项目一样,CORBA应用程序开发的第一步是进行需求分析。
开发团队需要与客户进行讨论,了解他们的需求和预期的应用程序功能。
这些需求包括要支持的对象类型、通信和交互的方式等。
2.接口设计:接下来,需要设计CORBA接口来定义对象之间的通信和交互协议。
CORBA接口使用接口定义语言(IDL)来描述对象的属性、方法和数据类型。
IDL是一种语言中立的描述语言,可以生成各种编程语言的代码。
3.IDL编译:一旦接口定义完成,IDL文件需要被编译成具体编程语言的代码。
CORBA支持多种编程语言,如C++、Java、Python等。
开发团队需要选择适合他们的编程语言,并使用CORBA提供的IDL编译器将IDL文件编译成特定语言的代码。
5.编译和构建:对象实现完成后,代码需要被编译和构建成可执行的应用程序。
这个过程与传统的软件开发流程类似,包括编译、链接和构建可执行文件的步骤。
6.部署和运行:部署CORBA应用程序需要考虑多个因素,如操作系统的兼容性、网络配置等。
开发团队需要确保应用程序可以在目标环境中正确运行,并处理可能出现的网络通信问题。
7.测试和调试:一旦应用程序部署完毕,开发团队需要进行系统测试和调试。
这包括使用各种测试工具和技术来验证应用程序的正确性和性能。
开发团队可能需要使用CORBA测试框架,如TAO(The ACE ORB)来进行测试。
8.维护和更新:一旦应用程序上线,并被用户使用,开发团队需要持续进行维护和更新。
这包括修复错误、添加新功能和进行性能优化。
CORBA应用程序的更新可能涉及到修改IDL文件和重新编译代码。
以上是CORBA应用程序开发的基本过程。
由于CORBA的复杂性和涉及到的多个技术,CORBA应用程序的开发需要经验丰富的开发团队和合适的工具支持。
通用对象请求代理结构
基于CORBA的分布式程序设计V1.01基于CORBA的分布式程序设计Advanced CORBA Distributed ProgrammingAuthor :尹峻峰Version: 1.01Date : 2003年5月20日Update : 2013-04-20目录引言 (3)摘录 (4)声明 (5)第一章CORBA简介 ................................................................ 11.1CORBA概述 ...............................................................................................................................................11.2CORBA的发展与演化.............................................................................................................................2第二章CORBA的核心 . (3)2.1基本概念: (3)2.2CORBA体系结构概述 (5)2.3核心ORB的结构 (8)2.3.1 ORB结构 (9)2.3.2 主要构件 (12)2.3.3 系统集成 (15)2.3.4 互操作 (16)第三章CORBA程序的编写过程 (22)3.1开发CORBA的步骤 (22)3.2CORBA程序的工作流程 (22)3.3工作流程的细节 (22)3.3.1 Server启动 (22)3.3.2 Client调用 (23)3.3.3 调用完成 (23)第四章CORBA的服务类型 (25)4.1详解CORBA事件服务实现 (25)4.1.1两种事件数据传送模型 (25)4.1.2事件信道 (25)4.1.3推模型 (26)4.1.4拉模型 (27)4.2C ORBA互操作的命名服务 (29)第五章基于CORBA的分布式软件开发 (33)5.1分布式技术的基本原理 (33)5.1.1传统的面向对象分析与面向对象设计方法 (33)5.1.2分布式对象技术 (33)5.2分布式软件构件的特征 (34)5.3分布式对象的服务 (34)5.4基于CORBA的分布式应用 (34)5.4.1分布式应用程序设计的主要问题 (34)5.4.2 Corba中IDL的设计 (35)第六章应用实例 (37)6.1新一代BOSS系统的CORBA解决方案 (37)6.1.1 应用背景 (37)6.1.2 简介 (37)6.1.3 BOSS系统体系结构 (38)6.1.4 开发新一代BOSS系统 (39)6.1.5本系统具有的特点 (41)6.2基于CORBA的聊天软件 (42)第七章结束语 (55)7.1CORBA的应用方向 (55)7.2CORBA应用前景 (55)第八章附录 (57)8.1CORBA版本 (57)8.2最新CORBA产品 (57)8.3最新标准CORBA3 (58)第九章参考资料 (61)引言近年来,随着互联网技术的日益成熟,公众及商业企业正享受着高速、低价网络信息传输所带来的高品质数字生活。
第二章 中间件Corba_初步
山东大学计算机科学与技术学院
2.2.1 ORB体系结构
客 户 服 务 器
界 面 仓 库
动态 调用
IDL 存根
ORB 界面
静态 IDL 框架
动态 框架 调用
对象 适配 器
对象实 现仓库
ORB 核 心(GIOP/IIOP)
所有 ORB 实现都一致的界面 可能有多个对象适配器 依赖 ORB 核心的界面 与每个对象对应的存根或框架
3 找到后,把参数传给该对象,调用它的方法,最后返
回结果。 激活或存储机制。
山东大学计算机科学与技术学院
4 客户方不需要了解服务对象的位置、通信方式、实现、
ORB基本原理
山东大学计算机科学与技术学院
2对象服务
作用:提供所有应用程序都可能用到的通用服务的接
口(基本服务,与具体的应用领域无关的接口)。
现有成员800多个,负责制定协议、实现基于
协议的软件产品、应用软件产品。
山东大学计算机科学与技术学院
OMG
为使该组织所采纳的技术具有开放性,OMG所 采用的方法是,针对某一领域发出RFP(Request For Proposal), 然后以各方提交的建议为基础,经过一系
列的讨论和协商,产生最终的规范。
3 公共设施
与对象服务不同的是,公共设施面向最终用户的应
用,它是各种应用可以共享的一系列服务集合。
复合文档的管理工具,数据库存取工具、文件打印
工具、电子邮件服务都等属于公共设施。
其标准化使得通用操作具有统一性,
山东大学计算机科学与技术学院
4 域接口
针对着某一特殊的应用领域。 可以按不同的应用领域来组织领域接口 按不同应用领域制订与发布一系列领域接口规范 目前:财务金融,电信,运输,电子商务,仿真等
runwithcontext 用法
runwithcontext 用法使用runwithcontext运行上下文是指在代码执行时,在给定的上下文环境中运行代码。
这种方法通常用于需要在特定环境中运行代码的情况,例如在特定的线程中或使用特定的参数。
在大多数编程语言中,runwithcontext函数接受两个参数:代码块和上下文。
代码块是要执行的代码,上下文是要在其中运行代码的环境。
以下是一个示例,展示了如何使用runwithcontext函数:pythondef run_with_context(code_block, context):# 在给定上下文中运行代码块with context:code_block()上面的示例是使用Python编写的,但在其他编程语言中也有类似的实现。
下面我们将详细介绍如何使用runwithcontext。
第一步:定义上下文类首先,我们需要定义一个上下文类。
这个类应该实现__enter__和__exit__方法,用于进入和退出上下文。
在这些方法内部,我们可以设置和清理上下文环境。
下面是一个示例上下文类的定义:pythonclass MyContext:def __enter__(self):# 设置上下文环境print("进入上下文")def __exit__(self, exc_type, exc_value, traceback):# 清理上下文环境print("退出上下文")在上面的例子中,我们定义了一个名为MyContext的上下文类,它在进入和退出上下文时分别打印了一条消息。
第二步:定义代码块接下来,我们需要定义一个代码块,它将在指定的上下文环境中运行。
代码块应该是一个函数或一个lambda表达式。
在代码块内部,我们可以执行一些操作或调用其他函数。
下面是一个示例代码块的定义:pythoncode_block = lambda: print("这是在上下文中运行的代码")上面的代码定义了一个简单的lambda表达式,它只打印一条消息。
python编写康托配对与反函数
python编写康托配对与反函数摘要:1.康托配对的概念2.康托配对的应用3.Python 编写康托配对4.反函数的定义与性质5.Python 编写反函数6.总结正文:1.康托配对的概念康托配对(Cantor Pairing)是一种用于构造不可数的方法,它可以将一个不可数无限集映射到一个不可数无限集。
康托配对是一种非常强大的工具,可以解决许多与无限集相关的问题。
2.康托配对的应用康托配对最著名的应用之一是康托- 伯恩斯坦定理(Cantor-Bernstein Theorem),该定理指出,如果两个集合可以通过康托配对相互映射,那么这两个集合的基数(即元素个数)是相等的。
康托配对还在其他许多数学领域有广泛的应用,如拓扑学、实分析等。
3.Python 编写康托配对在Python 中,我们可以使用函数来实现康托配对。
以下是一个简单的康托配对函数示例:```pythondef cantor_pairing(A):B = {x: i for i, x in enumerate(A)}return B```该函数接受一个集合A 作为输入,然后构造出一个新的集合B,其中B 的元素是A 中元素的一个编号。
通过这个函数,我们可以将A 映射到B,从而实现康托配对。
4.反函数的定义与性质反函数(Inverse Function)是指将函数的输出作为输入,将函数的输入作为输出的一种函数。
如果一个函数f 在其定义域内是一一对应的,那么我们可以找到一个函数g,使得对于所有的x,有f(g(x)) = x,g(f(x)) = x。
这样的函数g 称为函数f 的反函数。
5.Python 编写反函数在Python 中,我们可以使用函数来实现反函数。
以下是一个简单的反函数示例:```pythondef inverse_function(f):def g(x):for y in f:if f(y) == x:return yreturn Nonereturn g```该函数接受一个函数f 作为输入,然后构造出一个新的函数g,使得g(f(x)) = x。
测控系统中软总线平台设计与实现
测控系统中软总线平台设计与实现靳建彬;王元钦;陈源;包瑞【摘要】为满足测控系统对软件平台的要求,借鉴应用软件和操作系统之间的中间件技术,利用实时事件服务和命名服务机制构建分布式测控系统的软总线平台.此平台降低了算法组件之间的耦合,便于组件的并行开发和即插即用,有利于系统的功能扩展和结构重组,支持组件间的高速可持续数据传输.试验结果表明,此软总线平台能够有效地满足虚拟无线电分布式测控系统的要求.【期刊名称】《无线电工程》【年(卷),期】2010(040)011【总页数】4页(P4-6,48)【关键词】测控系统;软总线;实时事件服务;解耦合【作者】靳建彬;王元钦;陈源;包瑞【作者单位】装备指挥技术学院,北京,101416;装备指挥技术学院,北京,101416;装备指挥技术学院,北京,101416;中国人民解放军63999部队,北京,100094【正文语种】中文【中图分类】TP311.50 引言目前,基于软件无线电处理技术的测控系统受制于专用硬件设备(DSP/FPGA),在重组性、扩展性和通用性方面不够理想。
基于虚拟无线电的分布式测控系统由“天线+数字化接口+计算机+软件”构成[2],利用计算机实现测控系统的核心功能。
目前国外已经开展了基于虚拟无线电技术的软件化GSM基站、虚拟雷达(virtual radar)和软件GPS接收机方面的研究,国内也出现了软件化数字电视。
这种软件化处理的模式,一方面摆脱了对专有硬件平台的依赖,另一方面却使得软件模块增多,各信号处理模块之间耦合密切,数据交换频繁。
当组件之间有数据流动时,一个组件的更改会影响其他很多组件的调用。
面对上述问题,借鉴硬件总线的思想,运用软件、网络和通信等技术,设计了分布式测控系统的软总线数据传输平台。
试验结果表明此平台实现了组件间的数据传输和解耦合。
1 软总线平台结构与服务1.1 软总线基本思想计算机系统的硬件总线是计算机内各部件和输入输出设备相互传送信息的公共通道。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CORBA Programming with TAO - 1.Start(基本概念)收藏摘要:简要介绍CORBA的基本原理,并解释POA、stub、skeleton、servant等重要概念。
一、CORBA及TAO简介CORBA是一个为简化跨平台应用而提出的规范,它独立于网络协议、编程语言和软硬件平台,支持异构的分布式计算环境和不同编程语言间的对象重用。
CORBA可以作为不同平台应用间信息传递的中间件,CORBA通过引入经过充分验证的有效的框架结构和通信手段,最大限度地简化了网络通信相关应用的设计与开发,使得我们可以专注于业务逻辑的实现,而无需关心通信的细节。
CORBA曾在无数文章中被称作“软总线”,以表明它作为数据传递通道的基本特性。
现在存在众多CORBA实现,既有商用的ORBacus、VisiBroker,也有一些优秀的开源实现,如:TAO、omniORB、MICO等。
由于各实现遵从相同的规范,接口基本一致,所以在熟练应用一种CORBA实现后,转而使用其它实现时,一般不会存在太大的障碍。
TAO(The ACE ORB)是美国华盛顿大学的Douglas C. Schmidt教授领导开发的一个实时CORBA平台,它是一个免费的开放源码项目,用C++语言开发,符合CORBA2.6规范。
支持语言: C++支持平台: Win32,常见的各种Unix/Linux,实时操作系统如VxWorks等等。
在所有的CORBA实现中,TAO支持的平台是最多的。
支持的服务: Naming、Event、Notification、Security、Time、Scheduling、Logging、Lifecycle、Trading、Concurrency、Lifecycle、A/V Streaming、Load balancing等。
本系列文章将以当前最新的ACE-5.5+TAO-1.5+CIAO0.5为例,简要介绍如何应用TAO进行CORBA C++编程,其中部分内容(尤其是编译器配置相关的内容)是Windows平台特有的,但其它大多数信息在各平台上都是相同或者类似的。
二、基本概念本文不打算深入介绍CORBA相关的理论基础(已有很多书籍、文章讨论了这些内容),但在进入下一主题前,为了便于后续问题的讨论,这里简要介绍一下CORBA的基本原理,并对几个重要的基本概念进行解释,以便为没有相关知识的朋友扫清障碍。
下图是CORBA的基本模型:图中除上面那根灰线(有点浅,看不清的请慢慢找,^_^)以上的两个部分需要我们直接介入外,其他部分基本可以由IDL编译器自动生成或由CORBA实现为我们完成。
借助CORBA提供的中间件机制,我们在进行方法调用时,无需考虑被调用对象所在的具体位置,而是像调用一个本地模块的方法一样“直接”与其通信(因此,有些应用中,CORBA也被用于本地进程间通信,以降低各模块间的耦合度,同时也便于系统结构的调整)。
上图主要包括以下几个组成部分:∙Client即客户程序,Client通过调用服务程序提供的接口实现特定功能。
∙Object CORBA Object是一个语言无关的虚拟的实体,它可以由ORB定位,并可被客户程序请求调用,它最终由某种语言来具体实现,从而成为应用程序的一部分。
∙Servant即实例化的Object,Servant是组成服务程序,具体为Client提供服务的某个运行中(且被注册到OA)的C++/Java(或其他语言)对象。
Object与Servant是一对多的关系,一个Object可以被实例化多次,注册到一个或多个OA中为一个或多个Client提供服务,各Servant对应不同的IOR(多个IOR 具有相同的Type信息,但唯一标识不同),并且,每个Servant都可以由IOR唯一确定,对于持久Object,该IOR在两次启动同一系统时不会发生变化,除非服务程序所在主机IP或配置信息等发生改变,而对于非持久Object,该IOR在两次启动同一服务程序时,总是变化的(因为其中往往包含一个时间戳)。
∙Stub即桩,或称存根,Stub负责“假扮”Servant为Client提供一个本地化的接口,并负责与ORB进行交互,完成调用请求的列集(marshaling,即打包)与散集(unmarshaling,即解包)。
列集的主要作用是按双方ORB可以识别的方式对需要传递的数据进行格式化,而散集则将收到的数据中还原成上层应用可以理解的内存数据形式,对于远端指针,散集时ORB还负责分配相应的内存空间,并将指针的内容复制到本地内存空间以为本地应用提供一个远端指针的镜像,从而保证本地应用对远端指针的“透明”访问。
∙Skeleton与Stub对应,负责调用参数在Server端的解包和调用返回的打包。
∙ORB Core屏蔽底层通信细节的中间件,所有远程访问请求在Client和Server端的ORB间被传递,使得上层应用无需关注平台、语言、网络结构等方面的差异。
∙Object Adapter(OA) OA是ORB与Servant之间的桥梁,主要负责:1、产生对象引用;2、激活Servant或反之;3、将请求分解后传递给对应的Servant;4、与Skeleton配合完成对Servant提供方法的调用。
OA与Servant也是一对多的关系。
下面的图形进一步说明了ORB、OA、Skeleton、Servant之间的关系:关于OA的更为详细的信息,详见参考1。
三、编译TAOTAO可以从如下地址获得:/Download.html由于TAO是以源码包的形式发布的,因此,获得TAO源码包后,需要自行在所使用的平台上编译TAO。
由于下一系列《体验CORBA对象模型CCM》同样涉及CIAO的编译问题,因此下面将单独用一节内容来介绍如何在Windows平台上编译ACE+TAO+CIAO源码包。
参考:1、Irfan Pyarali, Douglas C. Schmidt. An Overview of the CORBA Portable Object Adapter./~schmidt/PDF/POA.pdf2、Michi Henning, Steve Vinoski. Advanced CORBA Programming with C++. Addison-Wesley, 1999.3、Mentoya. TAO使用指南. /ace_tao/tao_guide.htmlCORBA Programming with TAO - pile Source Code(编译ACE/TAO/CIAO)收藏摘要:简要介绍如何在Windows平台上编译ACE/TAO/CIAO,及编译过程中需注意的问题。
正文:随着ACE/TAO/CIAO研究者研究的不断深入,整个平台变得越来越庞大,涉及的工程及目录数目也越来越多,下面简要介绍一下如何在Windows平台上编译ACE/TAO/CIAO,其过程在其它平台上是类似的。
一、目录结构在开始之前,先简要介绍一下整个产品的目录结构。
ACE(Adaptive Communication Environment)是整个ACE/TAO/CIAO体系的基础,由操作系统适配层、对并发/进程间通信/虚拟内存管理等的OO封装、ACE 框架、网络服务组件等几个部分组成;而TAO(The ACE ORB)则是在ACE基础上建立起来的一个CORBA ORB实现;CIAO(Component Integrated ACE ORB)则是在TAO基础上的一个CORBA Component Model 实现,同时CIAO也是目前相对比较成熟的一个CCM实现。
正是由于三者之间的上述关系,在目录结构上整个源码包也采用了类似下面的结构:ACE_ROOT├─ace├─docs├─...├─TAO│├─tao│├─docs│├─orbsvcs(TAO实现的众多CORBA服务被放置在这个目录下)│├─...│├─CIAO││ ├─ciao││ ├─docs││ ├─DAnCE││ ├─RACE││ ├─...三个产品的帮助文档,可以在相应节点下的docs目录中找到,其中除了对相应产品特定模块或服务的说明外,还包括一些不错的Tutorial,对于我们理解相应产品很有帮助(ACE/TAO/CIAO的较完整的文档是收费的,这些随源码发布的文档虽然少,但仍颇为有用)。
二、关于编译器可以使用VC6/7.1/8来编译ACE/TAO/CIAO,不推荐使用VC7,但由于VC6的Project Settings不支持环境变量,会对我们使用CIAO带来一些麻烦(如需手动修改自动生成的工程文件),因此,笔者推荐读者使用VC8,即Visual C++ 2005来进行编译(注:现在VC++ 2005 Express可以从MS的网站上免费获得,但若安装该版本的话,需按照/express/visualc/usingpsdk/default.aspx的指示安装SDK并进行相关设置)。
VC8在调试器的设计上有了很大改进,同时对C++标准的支持也有了很大进步(但也变得非常耗资源),因此,下面的讨论将基于ACE-5.5+TAO-1.5+CIAO-0.5 + VC2005 Express,不保证在其它ACE或编译器版本下完全一致。
三、基本设置好啦,废话说完了,重新回到我们的主题。
首先,设置好如下环境变量:ACE_ROOTTAO_ROOTCIAO_ROOT分别指向ACE根目录,TAO根目录(即%ACE_ROOT%/TAO),CIAO根目录(即%TAO_ROOT%/CIAO)。
在%ACE_ROOT%/ace目录下添加一个文件config.h,并在其中添加如下内容:/* -*- C++ -*- *///=============================================================================/*** @file config.h**///=============================================================================#define ACE_HAS_STANDARD_CPP_LIBRARY 1#include "ace\config-win32.h"若是在其它平台上进行编译,还需要添加文件:$ACE_ROOT/include/makeinclude/platform_macros.GNU具体方法见ACE Installation Guide。
此外,为了便于今后使用ACE/TAO/CIAO,应当将%ACE_ROOT%/bin(部分通用工具的输出目录)%ACE_ROOT%/lib(所有.lib、.dll文件的输出目录)添加到PATH环境变量中。