`

利用Java和Java IDL创建CORBA应用

 
阅读更多

CORBA基本介绍 

  CORBA(Common Object Request Broker Architecture ,公用对象请求代理体系)是OMG(对象管理组织)于1991年提出的基于对象技术的分布计算应用软件体系结构。与过去的面向过程的RPC(Remote Procedure Call)不同,CORBA是基于面向对象技术的,它能解决远程对象之间的互操作问题。CORBA标准主要分为三个部分:接口定义语言(IDL)、对象请求代理(ORB),以及ORB之间的互操作协议IIOP,核心是对象请求代理。CORBA可以抽象系统平台、网络通讯及编程语言的差异。通过在CORBA技术规范中定义多种类型的服务,如名字服务(Naming Service)、事务服务(Transaction Service)、对象生命期服务(LifeCycle Service)、并发控制服务(Concurrency Control Service)、时间服务(Time Service)等功能,为应用软件开发者提供一个全面、健壮、可扩展的分布对象计算平台,使面向对象的应用软件在分布异构环境下方便地实现可重用、易移植和互操作。 

与RMI比较 

  与RMI 不同,CORBA 不属于Java 平台本身。OMG(Object Management Group,对象管理组织)发明了CORBA 规范,CORBA 被设计成与平台和语言无关。因此,CORBA对象可以运行于任何平台之上,位于网络的任何位置,还可以用任何语言(包括 Java、C、C++和Smalltalk 等)编写,只要该语言具有IDL(Interface Definition Language,接口定义语言)的映射。
  与RMI 相比,CORBA 是为更大、可伸缩更强的系统准备的,在这些系统中可能有数千个对象;CORBA 的编程和部署比RMI 更复杂,但允程序员开发需要事务、安全性等支持的企业级系统;CORBA 的命名服务也比RMI 命名注册功能更强大和灵活。

  CORBA 的实现称为ORB(Object Request Broker,对象请求代理)。Java IDL 即是CORBA 的一个实现,它是JDK1.3 或更高版本的核心软件包之一,定义在org.omg.CORBA及其子包中。在Java IDL 的支持下,开发人员可以使用如下两种方法将Java 和CORBA 集成在一起:
  ·创建Java 对象并使之可在CORBA ORB 中展开,
  ·创建Java 类并作为和其它ORB 一起展开的CORBA 对象的客户。这种方法提供了另外一种途径,通过它Java 可以被用于将你的新的应用和以前遗留的系统相集。

利用Java创建CORBA应用

     CORBA对象服务的实现方式分为两种:1)对象的命名引用方式 2)字符串化对象引用方式。不论采用何种高级语言,创建CORBA应用程序的过程大体如下:
    ● 编写IDL接口定义文件; 
    ● 将接口定义文件编译为相应高级语言源代码,产生服务器框架与客户端存根; 
    ● 基于服务器框架,编写服务对象实现程序;
    ● 基于客户端存根,编写客户对象调用程序; 
    ● 分别编译客户对象和服务对象程序; 
    ● 运行服务对象和客户对象程序;

java IDL 创建CORBA应用实例分析

    下面通过一个实例,描述如何通过Java创建CORBA应用程序。

1) 编写IDL 接口定义文件(Hello.idl) ,关于IDL 定义的语法请查看“IDL 定义语法”

 

module HelloApp {  

    interface Hello {  

        string sayHello(in string message);  

    };  

}; 

 

2) 将接口定义文件IDL 文件编译为相应的高级语言的源代码,产生服务器框架和客户端存根

SUN 通过将IDL 编译为java代码的工具idlj,产生服务框架和客户端存根,具体操作如下:

idlj -fall Hello.idl

 

编译后将在 HelloApp 子目录中形成以下六个文件:
HelloPOA.java 
  该抽象类是一个服务器 skeleton,它可为服务器提供基本的 CORBA 功能。它实现 Hello.java 接口。服务器类HelloServer 扩展 HelloPOA。
_HelloStub.java 
   该类是客户机 stub,可为客户机提供 CORBA 功能。它实现 Hello.java 接口。
Hello.java 
  该接口含有 IDL 接口的 Java 版本。Hello.java 接口扩展 org.omg.CORBA.Object 并提供标准的 CORBA 对象功能。
HelloHelper.java 
   这是一个终态类,可以提供辅助功能,特别是提供将 CORBA 对象引用转换为适当类型所需的 narrow() 方法。
HelloHolder.java 
   这是一个终态类,其中含有 Hello 类型的公有实例成员。它可为“out” 和 “inout” 变量提供操作。CORBA 有这些变量,但不容易映射为 Java 的语义。
HelloOperations.java
     这是一个接口类,其中含有方法 sayHello()。
要完成该应用程序,只需在文件 HelloServer.java 和 HelloClient.java 中提供服务器和客户机的实现即可。

 

3)接口实现HelloImpl.java

 HelloImpl.java是Hello IDL 接口的实现;每个Hello实例都由一个HelloImpl实例来实现。HelloImpl是HelloPOA的子类,HelloPOA是由idlj编译器从示例 IDL 中生成的。

import org.omg.CORBA.*;  
import HelloApp.HelloPOA;  
public class HelloImpl extends HelloPOA {  
    private ORB orb;  
    public void setORB(ORB orb_val) {  
        orb = orb_val;  
    }  
    /* 实现接口声明方法sayHello */  
    public String sayHello(String message) {  
        System.out.println("我在CORBA的服务器端,客户端正在调用'sayHello'方法。");  
        System.out.println("Hello  " + message);  
        return message;  
    }  
}  
 

3、服务器(HelloServer.java)
     服务器类含有服务器的main()方法,可完成以下任务:
     · 创建一个 ORB 实例
     · 创建一个HelloImpl实例(CORBA Hello对象的实现)并通知 ORB
     · 获取一个命名上下文的 CORBA 对象引用,在该命名上下文中注册新 CORBA 对象
     · 在命名上下文中将新对象注册在“Hello”名下
     · 等待对新对象的调用
import HelloApp.*;  
import org.omg.CosNaming.*;  
import org.omg.CORBA.*;  
import org.omg.PortableServer.*;  
import org.omg.PortableServer.POA;  
public class HelloServer {  
    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 注册 */  
            HelloImpl h = new HelloImpl();  
            h.setORB(orb);  
            System.out.println("将实例注册到ORB ");  
            /* 获取对服务端的对象引用 */  
            org.omg.CORBA.Object ref = rootpoa.servant_to_reference(h);  
            Hello href = HelloHelper.narrow(ref);  
            /* 从名称服务中获取根元素名称上下文 */  
            org.omg.CORBA.Object objRef = orb  
                    .resolve_initial_references("NameService");  
            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);  
            /* 在Hello名称下注册新对象 */  
            String name = "Hello";  
            NameComponent path[] = ncRef.to_name(name);  
            ncRef.rebind(path, href);  
            /* 等待客户端的调用。 */  
            orb.run();  
            System.out.println("等待CORBA客户端调用...");  
        }  
        catch (Exception e) {  
            System.err.println("ERROR: " + e);  
            e.printStackTrace(System.out);  
        }  
        System.out.println("HelloServer Exiting ...");  
    }  
}  
 4、客户端(HelloClient.java)
     下面的应用程序客户机将完成以下任务:
     · 创建一个 ORB
     · 获取一个指向命名上下文的引用
     · 在命名上下文中查找 "Hello" 并获得指向该 CORBA 对象的引用
     · 调用对象的 sayHello() 操作并打印结果
import HelloApp.*;  
import org.omg.CosNaming.*;  
import org.omg.CORBA.*;  
public class HelloClient {  
    public static void main(String args[]) {  
        try {  
            /* 创建和初始化 ORB */  
            ORB orb = ORB.init(args, null);  
            /* 获取根命名上下文 */  
            org.omg.CORBA.Object objRef = orb  
                    .resolve_initial_references("NameService");  
            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);  
            /* 在名称上下文中查找Hello对象,获取对它的引用。 */  
            String name = "Hello";  
            Hello h = HelloHelper.narrow(ncRef.resolve_str(name));  
            System.out.println("我在客户端,开始调用CORBA服务器端的'sayHello'方法");  
            System.out.println("欢迎,  " + h.sayHello("javamxj blog"));  
        } catch (Exception e) {  
            System.out.println("错误 : " + e);  
            e.printStackTrace(System.out);  
        }  
    }  
}  
 CORBA 服务器/客户端 编译运行
进入程序的目录,例如:F:\CORBA知识\FirstCorbaTest ,该目录包含:Hello.idl ,HelloClient.java ,HelloImpl.java ,HelloServer.java ;确认操作系统的telnet 客户端可用 例如:telnet 127.0.0.1 8000
依次运行:
idlj -fall Hello.idl
javac *.java HelloApp/*.java
tnameserv -ORBInitailHost 127.0.0.1 -ORBInitialPort 8000 java HelloServer -ORBInitialHost 127.0.0.1 -ORBInitialPort 8000 java HelloClient -ORBInitialHost 127.0.0.1 -ORBInitialPort 8000
运行成功,输出结果 ;程序如果报,连接超时,则应当确认telnet 是否可用 

分享到:
评论

相关推荐

    java idl 与 corba

    总之,Java IDL和CORBA为Java应用程序提供了一种强大的工具集,使其能够与其他语言编写的分布式对象和服务进行通信。随着CORBA规范的不断发展和完善,这些技术将继续在分布式计算领域发挥重要作用。

    使用 CORBA 和 Java IDL.doc

    ### 使用CORBA和Java IDL的关键知识点 #### 关于CORBA CORBA(Common Object Request Broker ...通过以上步骤,开发者可以构建出功能完整的CORBA应用程序,利用Java IDL的强大功能,实现跨语言、跨平台的分布式系统。

    Idl.zip_IDL CORBA_corba

    在实际开发中,开发者会使用 `idlj` 工具将 IDL 文件编译为 Java 类,然后在 Java 应用中导入这些 JAR 文件,以利用定义好的接口与 CORBA 服务器进行通信。此外,ORB(例如 JacORB 或 OpenORB)会负责对象的注册、...

    java_CORBA.rar_CORBA java_Java CORBA_corba

    学习这个压缩包中的内容,你可以了解到如何设置CORBA环境,如何编写和使用IDL,以及如何在Java中实现和调用远程对象。这对于理解分布式系统和企业级Java应用的开发非常有帮助,尤其是在需要跨平台交互的场景下。同时...

    支持选举的Java IDL应用

    在"支持选举的Java IDL应用"中,我们主要探讨的是如何利用Java IDL来实现一个选举系统,其中包含了服务器端的方法`getList`和`castVote`。 1. **Java IDL基础**: - Java IDL是Java Remote Method Invocation (RMI...

    介绍corba使用和java的集成

    Orbacus 提供了一套完整的工具集,用于生成 Java IDL 接口代码、构建 CORBA 对象和服务、以及部署和管理 CORBA 应用。 使用 Orbacus 进行 Java 和 CORBA 的集成,开发者首先需要定义接口的 IDL 文件,然后使用 ...

    corba.rar_java IDL

    "CORBA.rar_java IDL" 是一个与分布式计算相关的资源,主要涉及CORBA(Common Object Request Broker Architecture)技术在Java环境下的应用,利用Java IDL(Interface Definition Language)进行接口定义和通信。...

    java开发华为corba接口所需idl文件

    java开发华为corba接口所需要的华为idl文件,用于编译生成华为corba服务端接口. corba开发参考:https://my.oschina.net/dong706/blog?catalog=5757620

    java-idl.rar_java IDL

    Java IDL作为桥梁,使得Java程序员能够利用CORBA系统,实现分布式应用程序。 文档"java idl.doc"很可能是关于如何使用Java IDL进行CORBA接口开发的详细指南,涵盖了从理解IDL语言到实际编写和测试IDL文件的整个流程...

    JAVA_IDL_And_CORBA

    本次课的安排是介绍CORBA 及如何使用JAVA编写CORBA客户和服务。到本次课结束时大家应该能够使用JAVA设计和实现利用CORBA通信的系统

    corba实例(java版)

    Java版的CORBA利用Java平台的强大功能,提供了跨平台的远程对象调用能力。在这个实例中,我们将深入探讨如何在Java环境中使用CORBA。 首先,我们需要理解CORBA的核心概念:ORB(Object Request Broker),它是整个...

    JAVA corba编写例子

    JAVA与CORBA的结合,可以充分利用CORBA的跨平台通信优势,同时发挥JAVA在动态类型处理、内存管理和并发控制等方面的优势。对于需要高可靠性和可扩展性的应用,JAVA与CORBA的组合提供了强大的技术支持。 #### 三、...

    创建corba客户端教程

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

    corba.rar_Java CORBA_corba_corba p

    6. **Java IDL**:Java CORBA提供了Java版本的IDL,使得Java开发者可以直接在Java代码中使用IDL定义的接口,并且可以利用Java的特性,如垃圾回收、多线程等。 7. **编程示例**:提供的示例可能是演示如何创建和注册...

    JAVA与c++上分别的corba配置

    1. **CORBA (Common Object Request Broker Architecture)**: CORBA 是一种标准的中间件技术,它允许不同的应用程序在不同的操作系统、网络环境和编程语言之间进行通信。尽管现在有其他替代方案,如Web服务,但学习...

    java-Corba编程技术

    CORBA 提供了一种平台和语言无关的解决方案,允许开发者使用不同的编程语言在不同的操作系统上构建和连接分布式应用。通过ORB(Object Request Broker,对象请求代理),客户端可以透明地调用远程服务器上的对象方法...

    CORBA.rar_Java CORBA_corba_corba银行账户

    Java CORBA技术是一种分布式计算框架,它允许不同的应用程序在不同的操作系统和网络环境下相互通信,仿佛它们都在同一台机器上运行。"CORBA.rar_Java CORBA_corba_corba银行账户"是一个关于如何使用Java CORBA实现...

    CORBA技术及实例.rar_Java CORBA_corba_corba java_corba simple example_

    在Java中实现CORBA,主要依赖于Java IDL(Interface Definition Language)和JDK中的CORBA库。Java IDL允许将接口定义为IDL文件,然后这些接口可以被编译成Java接口,使得Java对象能够符合CORBA规范。CORBA库则提供...

    java corba demo

    Java CORBA(Common Object Request Broker Architecture)是一种中间件技术,用于构建分布式应用程序。它允许不同计算机上的对象相互交互,仿佛它们都在同一台机器上运行。Java CORBA与RMI(Remote Method ...

Global site tag (gtag.js) - Google Analytics