`
zxmzfbdc
  • 浏览: 47926 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

【原創】构建简单的CORBA应用

阅读更多
   JAVA还提供了对CORBA(Common Object Request Broker Architecture,通用对象请求代理体系结构)的支持。CORBA是分布式对象系统的一个标准,它由OMG(Ojbect Management Group,对象管理组)制定。CORBA包含了几个规范,来说明分布式系统的不同侧面,例如:IIOP(Internet Inter-Orb Protocol, Internet对象请求代理间协议)网络协议规范,定义了客户和服务器如何进行通信;COSNaming规范,定义了如何进行命名;还有OMG IDL,定义了描述对象接口,以便能够产生可以与他们交流的代理方式。CORBA还有很多这样的规范,每一个都覆盖分布式系统中需要定义的一部分。 CORBA是平台和语言独立的,这意味着它不依赖于任何语言,也不依赖于任何操作系统。下面我们概略的介绍IDL技术,以及JAVA对该技术的支持。

   IDL技术概述
   IDL 是Interface Definition Language(接口定义语言)的缩写,是OMG定义的标准语言,用于定义所有 CORBA 对象的接口。IDL接口将声明一批操作、异常和属性。每个操作都有一个用法说明。用法说明定义了操作的名称、参数、结果和异常。OMG IDL不包括操作的实现;相反,正如其名称所示,它只是一种用来定义接口的语言。IDL的完整句法和语义在 OMG 规范的第 3 章中进行讨论,可在 OMG 站点找到,地址是http://www.omg.org/technology/documents/idl2x_spec_catalog.htm。使用Java(TM)编写的API提供基于标准的和CORBA的交互性和连接性。
   JAVA IDL的语法和使用
   下面我们学习怎么写一个最简单的IDL文件,文件名称是hello.idl。代码如下:
   module cn{
       interface Hello{
           string say();
       };
   };

   结尾处的;不可省略。module相当与定义java的包,这里包名是cn,包名中不能包含.。interface用来定义接口,接口的名字是Hello。接口包含了一个方法,返回一个字符串。IDL中的字符串类型是string。对于基本数据类型而言,CORBA会选取语言定义更短的,这是IDL为了实现跨语言应用而不得不采取的折中。四、五两行大括号后面的;不可省略。
   接下来的工作,就是把这个idl文件编译成对应的java文件,这是通过JDK自带的idlj工具完成的,这个工具和javac在一个目录下。它的命令格式如下:
   idlj hello.idl
   我们可以使用-td参数指定生成java文件的路径,我的java文件所在的路径在在当前工程下的src中。我们可以指定生成文件的范围,比如只生成服务器端的文件,我们用-fserver命令行参数,如果只生成客户端的文件,使用-fserver参数,全部生成使用-fall参数。默认全部生成。在src 目录下,我们会发现新生成了一个目录cn,下面包含了6个java源文件,分述如下:
  • HelloPOA POA指的是Portable Object Adapter(轻便对象适配器)。这个抽象类是一个基于流的服务器端骨架,提供了服务器端基本的CORBA功能。
  • _HelloSutb 客户端的存根类,为客户端提供了CORBA功能。
  • Hello 这是java版的Hello接口,它提供了标准的CORBA对象功能。
  • HelloHelper 这是一个辅助类,负责向CORBA流中写入或读取对象。
  • HelloHolder 这是一个final类,它持有一个public的Hello实例变量。它用来操作CORBA输入输出流的参数。
  • HelloOperations 这个类才是我们所预想的那个接口,只包含我们定义的那个方法,不包含CORBA的任何东西。

   关于这些类的更详细的信息,读者可以参阅SUN公司发布的JavaDocs文档,里面有更详细的说明,还有更多的例子。
   现在我们提供一个服务器端的实现,注意这个实现类继承的是HelloPOA:
package cn.zxm.corba.hello.server;

import cn.HelloPOA;

public class HelloImpl extends HelloPOA {
    public String say() {
        System.out.println("客户调用时间——" + new java.util.Date());
        return "Hello World!";
    }
}

   接下来,把它绑定到命名服务,以便客户端可以调用:
package cn.zxm.corba.hello.server;

import java.util.Properties;

import org.omg.CORBA.ORB;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;

import cn.Hello;
import cn.HelloHelper;

public class HelloServer {
    public void run(String[] args) throws Exception {
        //生成一个对象请求代理(ORB),并初始化
        Properties props = new Properties();
        //初始化端口,默认的端口是900
        props.put("org.omg.CORBA.ORBInitialPort", "1050");
        //绑定到服务器
        props.put("org.omg.CORBA.ORBInitialHost", "192.168.1.100");
        //初始化ORB
        ORB orb = ORB.init(args, props);
        // get reference to rootpoa & activate the POAManager
        //获取一个根POA引用,并激活POA管理器
        POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
        poa.the_POAManager().activate();
        //实例化一个HelloImpl对象
        HelloImpl hello = new HelloImpl();
        // 从servant获得一个对象引用
        org.omg.CORBA.Object ref = poa.servant_to_reference(hello);
        Hello href = HelloHelper.narrow(ref);
        // 获得命名上下文
        org.omg.CORBA.Object objref = orb.resolve_initial_references("NameService");
        // 使用NamingContextExt 它是INS(Interoperable Naming Service,协同命名规范)的一部分
        NamingContextExt ncRef = NamingContextExtHelper.narrow(objref);
        //绑定一个对象引用,以便客户端可以调用
        String name = "Hello";
        NameComponent[] nc = ncRef.to_name(name);
        ncRef.rebind(nc, href);
        System.out.println("HelloServer ready and waiting......");
        //运行ORB
        orb.run();
    }
    
    public static void main(String[] args) {
        HelloServer server = new HelloServer();
        try {
            server.run(args);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}

   现在我们可以写客户端调用代码,代码如下:
package cn.zxm.corba.hello.client;

import java.util.Properties;

import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;

import cn.Hello;
import cn.HelloHelper;

public class HelloClient {
    public void run(String[] args) throws Exception {
        Properties props = new Properties();
        // 生成一个ORB,并初始化,这个和Server端一样
        props .put("org.omg.CORBA.ORBInitialPort", "1050");
        props.put("org.omg.CORBA.ORBInitialHost", "192.168.1.100");
        ORB orb = ORB.init(args, props);
        // 获得根命名上下文
        org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
        // 用NamingContextExt代替NamingContext.
        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

        // 通过名称获取服务器端的对象引用
        String name = "Hello";
        Hello hello = HelloHelper.narrow(ncRef.resolve_str(name));

        //调用远程对象
        System.out.println(hello.say());
    }

    public static void main(String[] args) {
        HelloClient client = new HelloClient();
        try {
            client.run(args);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

   一个完整的基于java的CORBA应用完成了,现在我们编译这些类了。编译完成后,我们需要启动orbd,这是一个类似于rmiregistry的工具,提供最简单的命名服务。启动的命令如下:
   start orbd -port 1050 -ORBInitialPort 1049 -ORBInitialHost localhost
这个命令定义了CORBA用到的服务器是本机,初始化端口是1049,使用的绑定端口是1050。然后我们运行HelloServer,命令是
   start java cn.zxm.corba.hello.server.HelloServer
   服务器会把_HelloStub绑定到orbd,我们使用的绑定名称是Hello。然后运行客户端,命令是
   java cn.zxm.corba.hello.client.HelloClient
运行效果如图1:

图1 CORBA客户端运行效果

   通过上面的例子,我们对CORBA有了一个初步的印象。CORBA本身是极为复杂的,读者可以看到,上面的绑定和调用都是很繁琐的,而且让人难于理解。总体而言,它比RMI要复杂的多,因此,我们可以借助于RMI的简易性来实现CORBA。对分布式应用感兴趣的朋友,可以到OMG或者SUN的网站上,察看关于它的更详细的信息。
  • 大小: 3.9 KB
分享到:
评论

相关推荐

    浅谈云计算在网络体系构建中的应用.pdf

    云计算在网络体系构建中的应用分析 云计算作为一种先进的计算方式,近年来在互联网行业得到了广泛的应用。云计算的特点包括海量的存储能力、强大的数据处理和计算能力。与传统计算方式相比,云计算具有更强的运算...

    医疗知识图谱构建与应用

    ### 医疗知识图谱构建与应用 #### 一、引言 随着互联网技术的快速发展,医疗服务模式也在不断创新。为了适应这种变化,医疗行业的信息化建设变得尤为重要。在这一背景下,构建医疗知识图谱成为了提高医疗服务质量...

    云原生 - 用容器,函数,和数据构建下一代应用

    该书从全局介绍云原生技术,不涉及太多技术细节。适合想初步了解相关领域的同学阅读。 《Cloud Native - Using Containers, Functions, and Data to Build Next-Generation Applications》 解压密码:cloudnative

    机器学习在湍流模型构建中的应用进展.pdf

    机器学习在湍流模型构建中的应用进展 机器学习是一种基于数据驱动的方法,它可以对湍流模型进行改进和构建。随着高性能计算机和数据共享平台的发展,研究者可以获取大量的高分辨率湍流计算数据。近年来,深度神经...

    使用Win32 API构建桌面Windows应用文档

    "使用Win32 API构建桌面Windows应用文档" 本文档旨在指导开发者使用Win32 API构建桌面Windows应用程序。Win32 API是Windows操作系统的核心API,提供了大量的功能来构建高性能、可靠的桌面应用程序。 桌面应用程序...

    ant工具可以构建web应用

    ant工具可以构建web应用,ant工具可以构建web应用ant工具可以构建web应用ant工具可以构建web应用ant工具可以构建web应用ant工具可以构建web应用ant工具可以构建web应用ant工具可以构建web应用ant工具可以构建web应用

    CORBA技术及实例

    通过以上步骤,我们构建了一个简单的基于CORBA技术的客户端-服务器应用程序,实现了跨进程、跨语言的对象交互功能。 #### 四、总结 CORBA作为一种成熟且广泛应用的分布式计算框架,提供了强大的功能和支持。通过对...

    创建corba客户端教程

    创建CORBA客户端是开发分布式应用的重要步骤,本教程将介绍如何使用C++和JAVA语言创建CORBA客户端应用程序。 ### CORBA客户端应用程序开发概念 #### 客户端应用程序概述 在CORBA体系中,客户端应用程序(Client ...

    Corba 模拟器

    【Corba 模拟器】是一种强大的工具,用于在不编写任何代码的情况下对Corba(Common Object Request Broker Architecture)系统...通过深入理解和熟练运用这类工具,开发者可以更有效地构建和维护高质量的Corba应用。

    知识图谱Knowledge Graph构建与应用实践高级研修班-课件01.7z

    本课程“知识图谱构建与应用实践高级研修班”旨在深入探讨这一领域的核心概念、构建方法以及实际应用。 课件中的"pub1知识图谱概论.pdf"可能涵盖以下几个方面的内容: 1. **知识图谱基础知识**:首先,课程可能会...

    基于Apache CXF构建SOA应用

    基于Apache CXF构建SOA应用。全面接受soa 和cxf.

    14天学会corba

    CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是软件开发中的一种中间件技术,用于构建分布式系统。这个“14天学会CORBA”教程可能是通过14个逐步的学习日程来引导读者深入理解和...

    CORBA简单教程(摘自sun microsystem)

    ### 分布式应用程序与CORBA #### 一、分布式系统的特性与挑战 分布式系统的特点在于其数据、计算...通过理解CORBA的工作原理及其关键组件,开发者可以更好地利用这种强大的分布式计算框架来构建高效、可扩展的系统。

    meteor-electron-client, 使用 Meteor 构建桌面应用程序的样板 !.zip

    meteor-electron-client, 使用 Meteor 构建桌面应用程序的样板 ! meteor-electron-client使用 Meteor 构建桌面应用程序的样板 !:为什么要构建带有的电子应用?这个项目是由这个视频启发的 ! Meteor 是在构建...

    AI人工智能技术分享 知识图谱技术及应用介绍-大规模医疗知识图谱构建与应用 共19页.pdf

    "AI人工智能技术分享 知识图谱技术及应用介绍-大规模医疗知识图谱构建与应用" 本资源概括了人工智能技术在医疗领域的应用,特别是知识图谱技术在大规模医疗知识图谱构建与应用中的角色。知识图谱是一个复杂的网络...

    CMDB构建与应用.pdf

    CMDB构建与应用 1、CMDB是什么 2、CMDB的构建 3、CMDB的应用 4、CMDB建设经验与案例分享

    SOA实践---构建基于Java_Web服务和BPEL的企业级应用

    《SOA实践—构建基于JavaWeb服务和BPEL的企业级应用》对SOA相关知识的讨论涵盖了面向服务的原理、关键协议与标准、设计与应用的全部过程。《SOA实践—构建基于JavaWeb服务和BPEL的企业级应用》共分8章,第1章对SOA...

    Node.js项目实践:构建可扩展的Web应用试读样章

    在本部分内容中,提到了一个实例,即从一个简单的“Hello World”开始,逐步构建出具有实际应用价值的Node.js应用。这种由浅入深的方式,是学习Node.js的一个经典路径,有助于初学者逐步建立起对整个Node.js开发框架...

    corba测试工具(Telcopro)

    CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是一种标准的中间件技术,它允许不同...通过深入理解和有效利用这样的工具,我们可以构建出更加健壮、高效和可维护的分布式应用程序。

    CORBA Specification 2.6

    CORBA规范2.6版深入探讨了事务处理服务的原理和实现,包括两阶段提交协议、事务隔离级别等高级主题,为构建高可靠性的分布式应用提供了理论和技术支持。 ### 安全服务 随着网络环境的日益复杂,安全问题成为了...

Global site tag (gtag.js) - Google Analytics