Java 版 (精华区)

发信人: angle (finder), 信区: Java
标  题: Java IDL 语言与CORBA接口剖析  
发信站: 哈工大紫丁香 (Wed Jun 23 19:58:19 1999), 转信

   随着Internet的逐渐兴起,网络中各个模块之间的通信就越发显得重要起
 来。Java中提供了CORBA技术,它使Java编写的模块同其它语言编写的模块之间能
 够互相通信。 而Java同CORBA之间是通过IDL(接口定义语言)定义的接口相链接
 的,在这里,我们对这些接口进行简单的探讨。 

   一.Java IDL简介 

   Java IDL是面向分布式对象的一种技术,即通过网络连接的不同平台上的对
 象之间的接口技术。Java IDL类似于Java RMI(Remote Method Invocation
 )。Java RMI只支持完全用Java语言编写的分布式对象之间的通信,而Java IDL
 可以使对象之间互相通信而不管它们是用Java语言编写还是用C、C++、COBOL、
 Ada、Smalltalk等其它语言编写的。 

   由于Java IDL是基于CORBA(Common Object Request Brokerage
 Architecture)分布式对象工业模型设计的,因此,它使得各种不同语言编写的
 模块之间进行通信成为可能。CORBA的关键特性是IDL(接口定义语言)。每一种
 支持CORBA的语言都有它自己的IDL接口映射。Java IDL支持CORBA到Java的映
 射。CORBA和IDL都是工业协会OMG(Object Management Group)的标准,SUN公
 司也是OMG的一员,因此有一个Java IDL组专门负责IDL到Java的接口映射。Java
 IDL提供ORB(Object Request Broker)来支持不同程序之间的交互通信,ORB是
 一组支持Java IDL应用程序和其它CORBA支持程序之间进行底层通信的类库。 

    

   二. CORBA的结构 

   任何相关的分布式对象都有两个方面:客户端/服务器端。服务器端提供远程
 通信的接口,客户端调用这些远程接口。这是分布式对象最为普遍的工作模式,包
 括Java RMI和CORBA。在这里,客户/服务器的交互通信是面向对象级而不是面向
 应用级设计的。实际上,一个单一对象可以成为远程对象所提供的接口的客户,同
 时,它也可以执行其他远程对象调用的接口程序。下图说明了分布式对象被CORBA
 客户调用和服务器执行程序方法的过程。 

   点击插图 

   图一 CORBA结构 

   在客户端,应用程序包括一个指向远程对象的引用。对象引用有一个存根方
 法,它支持远程调用。存根方法实际上是链入ORB类库,因此,调用它时会产生链
 接信息,提交请求到服务器端。 

   在服务器端,ORB使用一种纲要代码把远程请求翻译成调用本地对象的方法。
 这种纲要转录把调用和参数翻译成本地执行的详尽格式。当本地方法运行返回时,
 纲要转录又会翻译运行结果和错误,通过ORB传输回客户端。 

   在ORB之间,通信是通过IIOP(Internet Inter ORB Protocol)协议服务
 器的。它是基于TCP/IP的网际协议的,定义了遵循CORBA的ORB怎样向前和向后传
 送信息。同CORBA和IDL一样,IIOP协议标准由OMG定义。 

   除了提供简单的分布式对象交互能力之外,遵循CORBA的ORB还能提供由OMG定
 义的一些可选功能,包括按照名称查找对象、保持持续性的对象、支持事物处理、
 支持消息传送、分布式计算环境等等一些分布式环境的应用。一些厂商提供的Java
 ORB可以支持上述所有的功能,但Java IDL提供的ORB只支持按照名称锁定对象的
 功能。 

    

   三. 编写IDL接口文件 

   下面以经典的Hello World程序为例,编写IDL接口文件来分析Java IDL到
 CORBA的接口结构。这个程序十分简单,它只包括一个接口和一个操作。 

   第一步:定义CORBA IDL模块 

   CORBA模块是一个包含相关接口和定义的容器。它同Java Package包相对应。
 在IDL文件中定义的每一个模块都对应一个Java Package语句。 

   首先,利用任意一个文本编辑器创建一个Hello.idl文件;然后,在其中输入
 以下模块语句代码: 

   module HelloWorld 

   { 

    //加入其它代码 

   }; 

   在运行idltojava程序编译这个文件后,将产生Java文件的package语句。 

   第二步:定义接口 

   与Java语言的Interface语句一样,CORBA中的接口语句也表明对象之间的链
 接。在映射过程中,每个CORBA接口映射一个Java接口。编译后,在客户端和服务
 器端可以通过不同的方式实现和调用。 

   Module HelloWorld 

   { 

    interface Hello 

    { 

    //加入方法定义语句 

    }; 

   }; 

   第三步:定义操作 

   CORBA中定义的操作是在服务器端实现的,同时是由客户端来调用触发它。每
 个操作语句都对应Java接口中的一个方法。 

   Module HelloWorld 

   { 

    interface Hello 

    { 

    string sayHello();//方法 

    }; 

   }; 

    

   四. 分析从IDL文件Hello.idl到Java文件的映射 

   idltojava应用程序读入OMG IDL文件来创建需要的Java文件。它缺省设置了
 客户端和服务器端的两部分程序。而用户只需要简单地键入IDL文件名即可。例
 如: 

   idltojava Hello.idl 

   如果现在显示目录中的内容,就会发现系统自动创建的HelloWorld目录,该
 目录中共有五个文件。打开其中的Hello.java文件,你会发现它的形式如下: 

   /* Hello.java as generated by idltojava */ 

    

   package HelloApp; 

   public interface Hello 

   extends org.omg.CORBA.Object 

   { 

   String sayHello(); 

   } 

   通过分析这个例子,我们可以看出IDL语句是怎样映射产生Java语句的。 

   IDL语句 Java语句 

   Module HelloApp; package HelloApp; 

   Interface Hello; public interface Hello; 

   String sayHello(); String sayHello(); 

    

   值得注意的是,所有的CORBA对象都是由org.omg.CORBA.Object导出,用来
 支持CORBA的基本功能。这些都由idltojava程序生成,用户不需要做任何手工映
 射。 

    

   六.分析idltojava编译的输出 

   经过idltojava编译后的IDL文件产生了五个文件,一般用户会忽略它们。这
 些文件的数目可以由编译选项来控制。它们提供了对CORBA基本功能的支持。这五
 个程序是: 

   * _HelloImplBase.java: 这是一个抽象类,是服务器端的纲要程序,提供
 对服务器端的CORBA基本功能的支持。它继承idltojava创建的Hello.java接口。
 服务器端的程序应该继承这个类。 

   * _HelloStub.java: 这是一个客户端存根,提供对CORBA客户端的基本功能
 支持。它也继承idltojava创建的Hello.java接口。 

   * Hello.java: 这个接口程序是经过转换而成的Java版本的IDL接口,它包
 含我们刚才设计的唯一的方法sayHello();它继承org.omg.CORBA.Object类,提
 供对标准CORBA对象的支持。 

   * HelloHelper.java: 这个类主要提供一些辅助功能,主要处理把对CORBA
 对象的引用对照成一些合适的方式的精细方法。 

   * HelloHolder.java: 这个类支持Hello类型的公有型事例,它提供对输入
 输出参数的操作。它们是CORBA所支持的,但从语法上却不能直接映射为Java语言
 的一些操作。 

    

   通过以上的分析,就可以很清楚地了解Java IDL语言和CORBA接口的映射关系
 了,这对我们进行分布式对象的Java编程以及对CORBA的调用很有帮助。 
 

    


 















 

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: www-post@bbs.hit.edu]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.552毫秒