CORBA概述

CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程 序体系规范。或者说 CORBA体系结构是OMG为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案。

OMG:Object Management Group,对象管理组织。是一个国际化的、开放成员的、非盈利性的计算机行业标准协会,该协会成立于1989年,其职责是为应用开发提供一个公共框架,制订工业指南和对象管理规范,加快对象技术的发展。。任何组织都可以加入OMG并且参与标准制定过程。OMG制定了统一建模语言UnifiedModeling Language™ (UML®),模型驱动架构Model Driven Architecture® (MDA®)等建模标准。使强大的视觉设计,执行和维护软件等工序成为可能。并且,OMG还制定了广为人知的中间件标准Common Object Request Broker Architecture (CORBA®)。

通用对象代理体系结构CORBA(Common Object Request Broker Architecture)是OMG所定义的用来实现现今大量硬件、软件之间互操作的解决方案,CORBA也是迈向面向对象标准化和互操作的重要一步。

简单地说,CORBA允许应用之间相互通信,而不管它们存在于哪里以及是谁设计的,即跨平台、跨语言。CORBA1.1于1991年由OMG发布,其中定义了接口定义语言(IDL)以及在对象请求代理(ORB)中实现客户对象与服务器对象之间交互的应用编程接口(API)。CORBA2.0于1994年发布,规定了各个供应商之间的ORB的通信规则。

CORBA标准主要分为三个部分:接口定义语言(IDL)、对象请求代理(ORB)以及ORB之间的互操作协议IIOP。

IDL是CORBA定义的语言,CORBA还定义了IDL到各种语言的映射,标准映射的有Ada、C、C++、Smalltalk、Java、以及Python。有了这些映射,就可以将IDL翻译成各种语言,从而实现了跨语言。IDL语言是一种接口定义语言。IDL语言不同于所有已有的程序设计语言,它是一种描述性语言,也就是说,用它描述得到的接口是不能直接被编译执行。OMG IDL语言采用ISOLatin-1(8859.1)字符集。该字符集可以分为字母、数字、图形符号、空格符、和格式符号。其中字母包括英文26个字母的大小写,数字包括10个阿拉伯数字0到9。

ORB是CORBA的核心,是对象之间建立Client/Server关系的中间件。使用ORB,客户可以透明地调用一个服务对象上的方法,这个服务对象可以在本地,也可以在通过网络连接的其他机器上。ORB截获这一调用同时负责查找实现服务的对象并向其传递参数、调用方法返回最终结果。客户并不知道服务对象位于什么地方,它的编程语言和操作系统是什么,也不知道不属于对象接口的其他系统部分。这样,ORB在异构分布环境下为不同机器上的应用提供了互操作性,并无缝地集成了多种对象系统。

CORBA的基本结构如下:

在client端去调用server端的代码时,ORB对于client端是不可见的,client感觉好像调用了自己对象的方法一样,但是网络传输的过程都被封装在了ORB中。

CORBA和Java都采用面向对象技术,因此,可以很容易地用Java语言开发CORBA应用,或将Java应用以及JavaBean对象集成到CORBA应用环境中;CORBA和Java都适用于开发分布式应用,所不同的是:CORBA偏重于通用的分布式应用开发,而Java注重于WWW环境中的分布式应用开发。

使用CORBA开发的小例子

如果想开发一个CORBA的Helloworld,基本上有以下几个步骤:

1.使用idl语言开发idl文件,这个文件中描述了接口的定义

module helloworld{interface HelloWorld{string sayHello();};
};

module:对应了java中的package

interface:对应了java中的interface,HelloWorld即接口名称

sayHello:对应了java中interface声明的方法

string:对应了java中方法的返回值

2.使用java中的idlj命令,将idl语言翻译成java语言,并生成java代码

将idl文件拷贝到%JAVA_HOME%\bin下,然后在命令行下切换到bin目录下执行:

idlj -fall helloworld.idl

idlj:java自带的工具

-fall:生成server和client端代码,也可以单独生成server或client

helloworld.idl:之前创建的idl文件

此时,在bin目录下就会生成helloworld文件夹,文件夹中会有6个文件,将这6个拷回eclipse工程中。注意:文件中的包名就是idl中生命的helloworld。如下图:

这时_HelloWorldStub.java、HelloWorld.java、HelloWorldHelper.java、HelloWorldHolder.java、HelloWorldOperations.java是client需要的代码;HelloWorld.java、HelloWorldOperations.java、HelloWorldPOA.java是server需要的代码。

简单看一下自动生成的这几个文件:

HelloWorld.java,与idl中的接口名一模一样,但是实际上只是一个标识接口没有任何的实现

package helloworld;/**
* helloworld/HelloWorld.java .
* Generated by the IDL-to-Java compiler (portable), version "3.2"
* from helloworld.idl
* Friday, May 16, 2014 2:13:26 PM CST
*/public interface HelloWorld extends HelloWorldOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity
{
} // interface HelloWorld

HelloWorldOperations.java,是idl中声明的接口

package helloworld;/**
* helloworld/HelloWorldOperations.java .
* Generated by the IDL-to-Java compiler (portable), version "3.2"
* from helloworld.idl
* Friday, May 16, 2014 2:13:26 PM CST
*/public interface HelloWorldOperations
{String sayHello ();
} // interface HelloWorldOperations

_HelloWorldStub.java、HelloWorldHelper.java、HelloWorldHolder.java是client的桩和工具类;HelloWorldPOA.java是server的实现接口的类(大概是这个意思吧,不太懂),看着比较晕,就不贴了。

3.开发server端的代码

既然开发了接口定义,也翻译成了java代码,那么就要写接口的实现了,实现是在server端的,需要继承自的HelloWorldPOA

package server;import helloworld.HelloWorldPOA;/*** 服务器端的实现代码**/
public class HelloWorldImpl extends HelloWorldPOA {@Overridepublic String sayHello() {return "Hello World!";}}

server启动的代码,这段代码主要功能是将接口实现注册到ORB中,并启动监听,等待client来调用

package server;import helloworld.HelloWorld;
import helloworld.HelloWorldHelper;import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;public class HelloServer {public static void main(String[] args) throws ServantNotActive, WrongPolicy, InvalidName, AdapterInactive, org.omg.CosNaming.NamingContextPackage.InvalidName, NotFound, CannotProceed {//指定ORB的端口号 -ORBInitialPort 1050args = new String[2];args[0] = "-ORBInitialPort";args[1] = "1050";//创建一个ORB实例ORB orb = ORB.init(args, null);//拿到RootPOA的引用,并激活POAManager,相当于启动了serverorg.omg.CORBA.Object obj=orb.resolve_initial_references("RootPOA");POA rootpoa = POAHelper.narrow(obj);rootpoa.the_POAManager().activate();//创建一个HelloWorldImpl实例HelloWorldImpl helloImpl = new HelloWorldImpl();//从服务中得到对象的引用,并注册到服务中org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);HelloWorld href = HelloWorldHelper.narrow(ref);//得到一个根名称的上下文org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);//在命名上下文中绑定这个对象String name = "Hello";NameComponent path[] = ncRef.to_name(name);ncRef.rebind(path, href);//启动线程服务,等待客户端调用orb.run();System.out.println("server startup...");}
}

4.开发client端的代码

server端的实现与服务监听都已经做完,现在需要写一个client来调用server的方法

package client;import helloworld.HelloWorld;
import helloworld.HelloWorldHelper;import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;public class HelloClient {static HelloWorld helloWorldImpl;static {System.out.println("client开始连接server.......");//初始化ip和端口号,-ORBInitialHost 127.0.0.1 -ORBInitialPort 1050String args[] = new String[4];args[0] = "-ORBInitialHost";//server端的IP地址,在HelloServer中定义的args[1] = "127.0.0.1";args[2] = "-ORBInitialPort";//server端的端口,在HelloServer中定义的args[3] = "1050";//创建一个ORB实例ORB orb = ORB.init(args, null);// 获取根名称上下文org.omg.CORBA.Object objRef = null;try {objRef = orb.resolve_initial_references("NameService");} catch (InvalidName e) {e.printStackTrace();}NamingContextExt neRef = NamingContextExtHelper.narrow(objRef);String name = "Hello";try {//通过ORB拿到了server实例化好的实现类helloWorldImpl = HelloWorldHelper.narrow(neRef.resolve_str(name));} catch (NotFound e) {e.printStackTrace();} catch (CannotProceed e) {e.printStackTrace();} catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {e.printStackTrace();}System.out.println("client connected server.......");}public static void main(String args[]) throws Exception {sayHello();}//调用实现类的方法public static void sayHello() {String str = helloWorldImpl.sayHello();System.out.println(str);}
}

我们可以看到在server和client个创建了一个ORB的实例,这时因为在server和client都需要有支持通信(见上面的CORBA基本结构图)。

5.启动orbd服务

仅仅创建了server和client的代码还不足以跑起来一个HelloWorld,还需要启动一个orbd服务,这个服务在%JAVA_HOME%\jre\bin下。orbd包含自启动服务、透明的命名服务、持久化命名服务和命名管理器的后台处理进程。应该是上面的HelloWorld用到了nameService所以才会需要这个服务,使用其他方式拿server的实例是不是就不需要这个服务了,又或者是所有的CORBA都要与这个服务通信,不太明白?

在命令行下输入启动orbd:

cd /d  %JAVA_HOME%\bin
orbd -ORBInitialPort 1050 -ORBInitialHost 127.0.0.1

6.启动server服务

7.启动client

可以看到输出结果:

client开始连接server.......
client connected server.......
Hello World!

现在CORBA用的已经很少了,基本上只有一些大的电信项目还在用,现在同类的解决方案中WebService是比较流行的。

CORBA的简单介绍及HelloWorld相关推荐

  1. Springboot简单介绍

    Springboot入门介绍 一.Spring框架概述 1.1 什么是Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnso ...

  2. Linux系统Vi/Vim编辑器的简单介绍、安装/卸载、常用命令

    Linux系统Vi/Vim编辑器的简单介绍.安装/卸载.常用命令 1.介绍 vi(Visual Interface)编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界 ...

  3. WCF中绑定的简单介绍

    绑定基本概念 绑定就是一个从通用基础类型派生出来的运行时类型.绑定中描述了传输协议,消息编码格式和其他的一些用于通信的通信协议. 绑定的种类介绍 类型名 配置文件使用名 描述 BasicHttpBin ...

  4. OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)

    PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了. 在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简 ...

  5. python测试驱动开发_使用Python进行测试驱动开发的简单介绍

    python测试驱动开发 by Dmitry Rastorguev 德米特里·拉斯托格夫(Dmitry Rastorguev) 使用Python进行测试驱动开发的简单介绍 (A simple intr ...

  6. Rational Rose 2007简单介绍及详细安装步骤

    Rational Rose 2007简单介绍及详细安装步骤 Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具.用于可视化建模和公司级水平软件应用的组件构 ...

  7. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

  8. 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...

  9. 2021年大数据ELK(十五):Elasticsearch SQL简单介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...

最新文章

  1. android 选项卡TabHost
  2. php url 筛选,PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
  3. 蓝桥杯-最大的算式(java)
  4. Android UI线程和非UI线程
  5. 【PHP】xampp配置多个监听端口和不同的网站目录(转)
  6. sql 注入神器sqlmap 源码分析之调试sqlmap
  7. 华为或正与联发科、紫光展锐就采购更多芯片事宜展开磋商
  8. memcached mysql 性能测试_InnoDB memcached插件 vs 原生memcached对比性能测试
  9. oppo手机解锁_ColorOS一键解锁工具
  10. 共谋发展:软件孵化器与软件开发云
  11. matlab besselh,关于用matlab求bessel函数零点
  12. 什么是私域?什么是会员制?
  13. excel两个字符串相减_excel两列相减
  14. 计算机上策略禁止用户安装,Win7系统组策略禁止安装软件、软件安装控制策略禁止方法...
  15. 商业银行数字化转型的难点与路径
  16. 发帖机python_有没有自动发帖机,用python写得
  17. 晶体(crystal)和晶振(oscillator)的区别
  18. 文件实现输入三行hello,实现在每个hello后面换行
  19. c语言 ipc 参数 序列化,c语言编译原理及IPC通信经典面试题
  20. XStream的简单使用

热门文章

  1. 华为 2017 实习生招聘笔试题
  2. BLAST Database error: No alias or index file found for protein database
  3. iOS游戏开发之使用 Spritekit 框架和 Swift 的 iOS 2D 太空射击游戏(教程含源码)
  4. 全网首发 | Mac版 PS2022 终于来了,支持M1芯片,五大新黑科技
  5. [C]qsort的使用和实现
  6. Linux系统中systemctl命令的使用
  7. TCP/IP sysctl命令参数
  8. Download Example
  9. vs2019测试sizeof(string)的长度是28
  10. TCP/IP和TCP,UDP