1 / 19

第二章 基于 CORBA 的分布式平台

第二章 基于 CORBA 的分布式平台. 苗启广. qgmiao@mail.xidian.edu.cn. 计算机学院. 4. 7 C ORBA 编程- Hello World 例程. 分布式 HelloWord 程序的操作. 客户机调用 HelloServer 的 sayhello() 操作 ORB 把调用传给为 IDL 接口注册的提供服务的对象 提供服务的 sayhello() 方法运行并返回 Java String ORB 将该 String 传回客户机 客户机打印 string 值. 运行环境.

wallis
Download Presentation

第二章 基于 CORBA 的分布式平台

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第二章 基于CORBA的分布式平台 苗启广 qgmiao@mail.xidian.edu.cn 计算机学院

  2. 4.7 CORBA编程-Hello World例程

  3. 分布式HelloWord程序的操作 • 客户机调用HelloServer的sayhello()操作 • ORB把调用传给为IDL接口注册的提供服务的对象 • 提供服务的sayhello()方法运行并返回Java String • ORB将该String传回客户机 • 客户机打印string值

  4. 运行环境 运行环境由jdk1.3+idltojava 组成,具体的安装步骤如下: 安装JDK1.3: 从SUN公司下载jdk 1.3或者通过其他方式得到jdk 1.3进行安装,再设定相应的环境变量,在本文测试用的电脑上是如下所示: 下载idltojava: Java IDL编辑器(idltojava)在http://java.sun.com/products/jdk/idl/中单独提供。在JDK 1.3版中则提供了新的IDL编辑器idlj

  5. 内容 编辑IDL文件则用任何文本编辑器即可,具体的编写过程如下: 1、 编写 IDL 接口包括: l如何编写简单的 IDL 接口定义; l如何将 IDL 接口转换到 Java ; lidltojava 编译器生成的每个文件的用途 。 2、开发客户机应用程序,说明如何编写简单的客户机应用程序,包括: l如何创建 ORB 对象 ; l如何使用命名服务来取得初始的对象引用 ; l如何调用 CORBA 对象上的操作 。

  6. 3、开发客户机 Applet ,说明如何编写与客户机应用程序执行同样功能的客户机applet 。 4、开发 Hello World 服务器,说明如何编写简单的服务器,包括: l为服务器创建 ORB 对象 ; l实例化服务程序并将它连接到 ORB ; l通过命名服务来注册该服务程序 ; l使服务器等待对服务程序的调用 。 内容

  7. IDL接口定义了应用程序中客户机部分和服务器部分之间的约定,同时指定可用的操作和属性 IDL接口定义了应用程序中客户机部分和服务器部分之间的约定,同时指定可用的操作和属性 • 用来指定分布式应用程序的操作接口,与编程语言无关 • 编写实现代码前,必须将IDL接口映射到Java(自动完成) • 实现映射后,IDL每条语句都转换为所选编程语言中的相应语句 编写 IDL 接口

  8. 服务器将代表调用他们的客户机执行的行为,每条操作语句都在所生成的JAVA接口中生成相应的方法语句服务器将代表调用他们的客户机执行的行为,每条操作语句都在所生成的JAVA接口中生成相应的方法语句 1、编写 Hello.idl 4.7.1 编写 IDL 接口 启动自己熟悉的文本编辑器,创建名为 Hello.idl的文件,编写如下代码: module HelloApp { interface Hello { string sayHello(); }; }; 可以看出用于 Hello World 的 IDL 非常简单,它的单一接口执 行单一操作。仅需执行三步: l声明 CORBA IDL 模块 l声明接口 l声明操作 是一个名字空间,是相关接口和声明的容器,每条模块语句都被映射到一条Java Package语句 声明一个对象与其它对象的API约定,映射后,IDL中的每条interface语句都映射到一条Java Interface语句

  9. 2、将 Hello.idl从 IDL 映射到 Java • 工具IDLtoJava读取IDL文件并创建所需的JAVA文件,执行: • 进入命令行提示 • 将目录改为hello.idl文件所在的位置 • 输入编译器命令:idltojava hello.idl • 或 idlj –fall hello.idl • 生成Helloapp目录,生成一些文件。

  10. 2、将 Hello.idl从 IDL 映射到 Java 生成的五个主要文件分别是: _HelloImplBase.java:此抽象类是服务器 skeleton,为服务器提供基本 CORBA 功能。它实现 Hello.java接口。服务器类 HelloServant扩展 _HelloImplBase。 _HelloStub.java:该类是客户机 stub,为客户机提供 CORBA 功能。它实现 Hello.java接口。 Hello.java :此接口包含 IDL 接口的 Java 版本。它包含方法 sayHello()。Hello.java接口扩展 org.omg.CORBA.Object,也提供标准 CORBA 对象功能。 HelloHelper.java :此终态类提供辅助功能,其中特别有用的是narrow()方法,可用于将 CORBA 对象引用强制转换为适当类型。 HelloHolder.java:此终态类保存类型 Hello 的公共实例成员,可提供对 out 和 inout 参数的操作。

  11. 映射 IDL不分大小写 • Hello.java,代码如下所示: • /* idltojava 生成的 Hello.java */ • package HelloApp; • public interface Hello • extends org.omg.CORBA.Object • { • String sayHello(); • } Hello.idl module HelloApp { interface Hello { string sayHello(); };

  12. 导入所需的包 声明客户机类 定义 main()方法 创建 ORB 对象 获得初始命名上下文,是对命名服务的对象引用 限定对象引用,NcRef可用来访问命名服务和查找其它服务 在命名中查找服务 处理 CORBA 系统异常 CORBA客户机需要本地ORB对象来执行其所有编组和IIOP操作 HelloClient.java程序源码: import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CORBA.*; public class HelloClient { public static void main(String args[]) { try{ ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); NameComponent nc = new NameComponent("Hello", ""); NameComponent path[] = {nc}; Hello helloRef = HelloHelper.narrow(ncRef.resolve(path)); String Hello = helloRef.sayHello(); System.out.println(Hello); } catch(Exception e) { System.out.println("ERROR : " + e); e.printStackTrace(System.out); } } } 2.6.2 编写客户机应用程序

  13. 服务器是一种实例化一个或多个 servant 对象的进程。servant 实现 idltojava 生成的接口,并实际执行该接口上的操作。 实例化 servant 对象 获得初始命名上下文 限定对象引用 创建 ORB 对象 将 servant 对象连接到 ORB 在名字服务器中注册 servant 对象 等待调用 import HelloApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; public class HelloServer { public static void main(String args[]) { try{ ORB orb = ORB.init(args, null); HelloServant helloRef = new HelloServant(); orb.connect(helloRef); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); NameComponent nc = new NameComponent("Hello", ""); NameComponent path[] = {nc}; ncRef.rebind(path, helloRef); java.lang.Object sync = new java.lang.Object(); synchronized(sync){ sync.wait(); } } catch(Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } } 4.7.3 编写 Hello World 服务器程序

  14. 定义 servant 类 声明sayHello()方法 编写 sayHello()实现 class HelloServant extends _HelloImplBase { // sayHello() 方法。 public String sayHello() { //加入方法实现。 return "\nHello world!!\n"; } }

  15. 4.7.4 编译和运行 1.客户机安装 创建Client新目录,将helloclient.java拷入 2.编译客户机应用程序 进入client目录, 运行Java编译器 javec helloclient.java 3.服务器安装 创建server目录,将helloserver.java和helloclent.class拷入 将helloapp目录内容拷入 4.编译服务器 进入server目录,运行java编译器 javac helloserve.java

  16. 4.7.4 编译和运行 5.运行 l启动 Java IDL 名字服务器: tnameserv -ORBInitialPort 1050 & l启动 Hello 服务器: java HelloServer -ORBInitialPort 1050 & l在另一个窗口中运行 Hello 客户机应用程序: java HelloClient -ORBInitialPort 1050 打印到命令行的字符串如下所示: Hello world!!

  17. 启动JavaIDL名字服务器后的结果

  18. 启动Hello服务器后的结果

  19. 启动Hello客户机后的结果

More Related