Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "第二章 基于CORBA的分布式平台 苗启广 qgmiao@mail.xidian.edu.cn 计算机学院."— Presentation transcript:

1 第二章 基于CORBA的分布式平台 苗启广 计算机学院

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)在 1.3版中则提供了新的IDL编辑器idlj

5 编辑IDL文件则用任何文本编辑器即可,具体的编写过程如下: 1、 编写 IDL 接口包括: l 如何编写简单的 IDL 接口定义;
内容 编辑IDL文件则用任何文本编辑器即可,具体的编写过程如下: 1、 编写 IDL 接口包括: l    如何编写简单的 IDL 接口定义; l    如何将 IDL 接口转换到 Java ; l    idltojava 编译器生成的每个文件的用途 。 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每条语句都转换为所选编程语言中的相应语句

8 4.7.1 编写 IDL 接口 1、编写 Hello.idl 启动自己熟悉的文本编辑器,创建名为 Hello.idl 的文件,编写如下代码:
服务器将代表调用他们的客户机执行的行为,每条操作语句都在所生成的JAVA接口中生成相应的方法语句 1、编写 Hello.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 Hello.java,代码如下所示: /* idltojava 生成的 Hello.java */ Hello.idl
package HelloApp; public interface Hello extends org.omg.CORBA.Object { String sayHello(); } Hello.idl module HelloApp { interface Hello string sayHello(); }; 映射 IDL不分大小写

12 CORBA客户机需要本地ORB对象来执行其所有编组和IIOP操作
编写客户机应用程序 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); } 导入所需的包 声明客户机类 定义 main() 方法 获得初始命名上下文,是对命名服务的对象引用 创建 ORB 对象 限定对象引用,NcRef可用来访问命名服务和查找其它服务 在命名中查找服务 处理 CORBA 系统异常

13 4.7.3 编写 Hello World 服务器程序 创建 ORB 对象
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); 服务器是一种实例化一个或多个 servant 对象的进程。servant 实现 idltojava 生成的接口,并实际执行该接口上的操作。 创建 ORB 对象 实例化 servant 对象 将 servant 对象连接到 ORB 获得初始命名上下文 限定对象引用 在名字服务器中注册 servant 对象 等待调用

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

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

16 tnameserv -ORBInitialPort 1050 & l 启动 Hello 服务器:
编译和运行 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客户机后的结果


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

Similar presentations


Ads by Google