RMI、CORBA、IIOP简单实例--2. CORBA
--------------------------------------------------------------------------------
RMI、CORBA、IIOP简单实例--2. CORBA
CORBA基本介绍
CORBA(公用对象请求代理体系)是OMG(对象管理组织)于1991年提出的基于对象技术的分布计算应用软件体系结构。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对象服务的实现方式分为两种:对象的命名引用方式和字符串化对象引用方式。不论采用何种高级语言,创建CORBA应用程序的过程大体如下:
● 编写IDL接口定义文件;
● 将接口定义文件编译为相应高级语言源代码,产生服务器框架与客户端存根;
● 基于服务器框架,编写服务对象实现程序;
● 基于客户端存根,编写客户对象调用程序;
● 分别编译客户对象和服务对象程序;
● 运行服务对象和客户对象程序;
CORBA实例分析
下面通过一个实例,描述如何通过Java创建CORBA应用程序。
1. 接口定义 (Hello.idl)
Hello.idl
module HelloApp
{
interface Hello
{
string sayHello(in string message);
};
};
通过Sun提供的将IDL文件编译成Java源代码的工具id××××(jdk1.3.0_01以上版本),为接口定义文件生成客户端存根和服务器框架。具体操作如下:
id×××× -oldImplBase -fall Hello.idl
编译后将在 HelloApp 子目录中形成以下六个文件:
n _HelloImplBase.java
该抽象类是一个服务器 skeleton,它可为服务器提供基本的 CORBA 功能。它实现 Hello.java 接口。服务器类 HelloServant 扩展 _HelloImplBase。
n _HelloStub.java
该类是客户机 stub,可为客户机提供 CORBA 功能。它实现 Hello.java 接口。
n Hello.java
该接口含有 IDL 接口的 Java 版本。Hello.java 接口扩展 org.omg.CORBA.Object 并提供标准的 CORBA 对象功能。
n HelloHelper.java
这是一个终态类,可以提供辅助功能,特别是提供将 CORBA 对象引用转换为适当类型所需的 narrow() 方法。
n HelloHolder.java
这是一个终态类,其中含有 Hello 类型的公有实例成员。它可为“out” 和 “inout” 变量提供操作。CORBA 有这些变量,但不容易映射为 Java 的语义。
n HelloOperations.java
这是一个接口类,其中含有方法 sayHello()。
要完成该应用程序,只需在文件 HelloServer.java 和 HelloClient.java 中提供服务器和客户机的实现即可。
2. 接口实现
HelloImpl.java是Hello IDL 接口的实现;每个Hello实例都由一个HelloImpl实例来实现。HelloImpl是_HelloImplBase的子类,_HelloImplBase是由 id××××编译器从示例 IDL 中生成的。
HelloImpl.java
/*
* @author javamxj (CSDN Blog) 创建日期 2004-12-27
*/
import HelloApp.*;
public class HelloImpl extends _HelloImplBase {
/* 构造函数 */
public HelloImpl() {
super();
}
/* 实现接口声明方法sayHello */
public String sayHello(String message) {
System.out.println("我在CORBA的服务器端,客户端正在调用'sayHello'方法。 ");
System.out.println("Hello " + message);
return message;
}
}
3. 服务器
服务器类含有服务器的main()方法,可完成以下任务:
? 创建一个 ORB 实例
? 创建一个HelloImpl实例(CORBA Hello对象的实现)并通知 ORB
? 获取一个命名上下文的 CORBA 对象引用,在该命名上下文中注册新 CORBA 对象
? 在命名上下文中将新对象注册在“Hello”名下
? 等待对新对象的调用
HelloSever.java
/*
* @author javamxj (CSDN Blog) 创建日期 2004-12-27
*/
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class HelloServer {
public static void main(String args[]) {
try {
/* 创建和初始化 ORB */
ORB orb = ORB.init(args, null);
System.out.println("开始 ORB Server ...");
/* 创建一个实例并将其向 ORB 注册 */
HelloImpl helloImpl = new HelloImpl();
orb.connect(helloImpl);
System.out.println("将实例注册到ORB ");
/* 获取根命名上下文 */
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, helloImpl);
/* 等待来自客户机的调用 */
java.lang.Object sync = new java.lang.Object();
synchronized (sync) {
sync.wait();
}
System.out.println("等待CORBA客户端调用...");
} catch (Exception e) {
System.err.println("错误: " + e);
e.printStackTrace(System.out);
}
}
}
4. 客户端
下面的应用程序客户机将完成以下任务:
? 创建一个 ORB
? 获取一个指向命名上下文的引用
? 在命名上下文中查找 "Hello" 并获得指向该 CORBA 对象的引用
? 调用对象的 sayHello() 操作并打印结果
HelloClient.java
/*
* @author javamxj (CSDN Blog) 创建日期 2004-12-27
*/
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");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
/* 解析命名中的对象引用 */
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = { nc };
Hello h = HelloHelper.narrow(ncRef.resolve(path));
/* 调用 Hello 服务器对象并打印结果 */
System.out.println("我在客户端,开始调用CORBA服务器端的'sayHello'方法");
System.out.println("欢迎, " + h.sayHello("javamxj blog"));
} catch (Exception e) {
System.out.println("错误 : " + e);
e.printStackTrace(System.out);
}
}
}
CORBA Server/Client的编译与运行
? 把上面4个文件复制到D:\CorbaSample目录下,在此目录下建立Client和Server目录,假设它们分别为客户端和服务端。
? 编译Hello.idl
D:\CorbaSample>id×××× -oldImplBase -fall Hello.idl
这会生成一个HelloApp的目录
? 编译所有java文件:
D:\CorbaSample>javac *.java HelloApp/*.java
? 分别在Client和Server目录下建立HelloApp子目录,将D:\CorbaSample\HelloApp目录中的
_HelloStub.class
Hello.class
HelloHelper.class
HelloHolder.class
HelloOperations.class
复制到D:\CorbaSample\Client\HelloApp目录下,再将D:\CorbaSample目录中的HelloClient.class复制到D:\CorbaSample\Client目录下。
将D:\CorbaSample\HelloApp目录中的
_HelloImplBase.class
Hello.class
HelloOperations.class
复制到D:\CorbaSample\Server\HelloApp目录下, 再将D:\CorbaSample目录中的HelloServer.class和 HelloImpl.class 复制到D:\CorbaSample\Server目录中
(注意:当然,你可以不必建立Server和Client目录及以上复制文件的操作,可以直接在D:\CorbaSample目录中进行操作,我这样做的目的主要是为了区分客户端和服务端)
? 确保名字服务器处于运行状态:
D:\CorbaSample\Server>tnameserv -ORBInitialPort 1050
? 启动 Hello 服务器:
D:\CorbaSample\Server>java HelloServer -ORBInitialPort 1050
? CORBA客户端调用CORBA服务:
D:\CorbaSample\Client>java HelloClient -ORBInitialPort 1050
(本地调用,不需要用-ORBInitialHost参数来指定远程的IP地址)
D:\CorbaSample\Server>java HelloClient -ORBInitialHost localhost -ORBInitialPort 1050
(远程调用CORBA服务,可以将localhost替换成远程的IP地址)
图1. 客户端没有调用CORBA服务之前
图2. 客户端调用CORBA服务之后
--------------------------------------------------------------------------------
一点补充:
不知道大家注意到没有,在JDK1.4编译idl文件时使用的 id×××× -oldImplBase -fall Hello.idl
这个命令带有“-oldImplBase”参数,表示这是一个老版本的实现。而JDK1.4版本下,可以直接使用
id×××× -fall Hello.idl 命令,这样id××××编译器对服务器端生成的是轻便对象适配器(POA)。
(直接再命令行敲入id××××可以得到其使用说明)
这里我就不作详细说明了,操作基本上与上一个例子相似。
首先在 D:\CorbaSample2 目录下编写下面4个文件,然后依次进行如下操作:
D:\CorbaSample2>id×××× -fall Hello.idl
D:\CorbaSample2>javac *.java HelloApp/*.java
D:\CorbaSample2>tnameserv -ORBInitialPort 1050
D:\CorbaSample2>java HelloServer -ORBInitialPort 1050
D:\CorbaSample2>java HelloClient -ORBInitialPort 1050
(注意:这里为了方便.我没有再划分客户端和服务端。进行对比,你可以发现这次id××××编译器生成的文件与上例中生成的文件有和不同。)
Hello.idl
module HelloApp
{
interface Hello
{
string sayHello(in string message);
};
};
HelloImpl.java
/*
* @author javamxj (CSDN Blog) 创建日期 2004-12-27
*/
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;
}
}
HelloServer.java
/*
* @author javamxj (CSDN Blog) 创建日期 2004-12-27
*/
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 ...");
}
}
HelloClient.java
/*
* @author javamxj (CSDN Blog) 创建日期 2004-12-27
*/
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);
}
}
}
版权声明:CSDN是本Blog托管服务提供商。如本文牵涉版权问题,CSDN不承担相关责任,请版权拥有者直接与文章作者联系解决。
wuzhu
2005-03-24, 09:25 AM #2
maplesVIP
牛顿的apple ^(oo)^
勋章荣誉
注册日期: 04-07
住址: Paradise lost
星座:
帖子: 10428
精华: 3
声望力: 1
声望: 26 回复: RMI、CORBA、IIOP简单实例--2. CORBA
--------------------------------------------------------------------------------
呵呵~
收下先
__________________
世界上有3个东西越是压抑就越是反应强烈
咳嗽,孤独,爱...
maples
查看公开信息
访问 maples 的个人网站
查找 maples 发表的更多帖子
2005-03-31, 08:43 AM #3
jlinux
桑梓大一
注册日期: 04-05
帖子: 125
精华: 0
声望力: 0
声望: 10 回复: RMI、CORBA、IIOP简单实例--2. CORBA
--------------------------------------------------------------------------------
对于本例,其中程序具体内容只供参考,主要是借鉴其中的运行指令及步骤:
这一步:
{? 编译Hello.idl
D:\CorbaSample>id×××× -oldImplBase -fall Hello.idl
这会生成一个HelloApp的目录}我们运行程序的时候需要参考,其余步骤按照课本即可。
CORBA Server/Client的编译与运行
? 把上面4个文件复制到D:\CorbaSample目录下,在此目录下建立Client和Server目录,假设它们分别为客户端和服务端。
? 编译Hello.idl
D:\CorbaSample>id×××× -oldImplBase -fall Hello.idl
这会生成一个HelloApp的目录
? 编译所有java文件:
D:\CorbaSample>javac *.java HelloApp/*.java
? 分别在Client和Server目录下建立HelloApp子目录,将D:\CorbaSample\HelloApp目录中的
_HelloStub.class
Hello.class
HelloHelper.class
HelloHolder.class
HelloOperations.class
复制到D:\CorbaSample\Client\HelloApp目录下,再将D:\CorbaSample目录中的HelloClient.class复制到D:\CorbaSample\Client目录下。
将D:\CorbaSample\HelloApp目录中的
_HelloImplBase.class
Hello.class
HelloOperations.class
复制到D:\CorbaSample\Server\HelloApp目录下, 再将D:\CorbaSample目录中的HelloServer.class和 HelloImpl.class 复制到D:\CorbaSample\Server目录中
(注意:当然,你可以不必建立Server和Client目录及以上复制文件的操作,可以直接在D:\CorbaSample目录中进行操作,我这样做的目的主要是为了区分客户端和服务端)
? 确保名字服务器处于运行状态:
D:\CorbaSample\Server>tnameserv -ORBInitialPort 1050
? 启动 Hello 服务器:
D:\CorbaSample\Server>java HelloServer -ORBInitialPort 1050
? CORBA客户端调用CORBA服务:
D:\CorbaSample\Client>java HelloClient -ORBInitialPort 1050
(本地调用,不需要用-ORBInitialHost参数来指定远程的IP地址)
D:\CorbaSample\Server>java HelloClient -ORBInitialHost localhost -ORBInitialPort 1050
(远程调用CORBA服务,可以将localhost替换成远程的IP地址)
分享到:
相关推荐
3. **EJB示例**:可能是简单的会话bean或实体bean,展示了如何在EJB中使用RMI-IIOP。 4. **配置文件**:可能包含ORB的配置信息,如ORB供应商、IIOP端口等。 学习这个实例,你需要理解以下知识点: - **RMI概念**:...
RMI-IIOP是RMI的一个扩展,它结合了RMI的功能与CORBA的IIOP(Internet Inter-ORB Protocol)协议,使得Java对象可以与CORBA系统进行交互。现在我们详细探讨这两个概念以及它们如何在客户端和服务器之间进行交互。 *...
通过深入研究这个RMI-IIOP的实例,我们可以更好地理解如何在Java中实现分布式的、跨平台的应用,并掌握RMI和IIOP在实际项目中的应用技巧。此外,了解如何在不同环境和网络条件下调试和优化RMI-IIOP应用也是至关重要...
Java RMI-IIOP(Remote Method Invocation - Internet Inter-ORB Protocol)是Java平台中用于分布式计算的一种技术,它结合了Java RMI和CORBA(Common Object Request Broker Architecture)的IIOP协议,使得Java...
Java RMI-IIOP(Remote Method Invocation - Internet Inter-ORB Protocol)是Java平台中用于分布式计算的一种技术,它结合了Java RMI和CORBA(Common Object Request Broker Architecture)的优点。RMI使得Java对象...
RMI-IIOP(Remote Method Invocation - Internet Inter-ORB Protocol)是Java平台中用于分布式计算的一种技术,它结合了Java RMI(远程方法调用)和CORBA(Common Object Request Broker Architecture)的IIOP协议,...
"www.pudn.com.txt"可能包含了更多关于这些主题的详细教程或示例代码,例如如何设置RMI服务器和客户端,或者是如何使用CORBA构建一个简单的分布式应用。"分布式对象技术"文件名可能包含对分布式对象技术的深入讨论,...
RMI-IIOP是RMI的一个扩展,它结合了RMI与CORBA(Common Object Request Broker Architecture)的技术。IIOP(Internet Inter-ORB Protocol)是CORBA的一种标准通信协议,使得不同平台的CORBA对象可以通过Internet...
内容有:简单的EJB、无状态SessionBean、有状态SessionBean、BMP位图实例、cmp实例、Message-Driven Bean、JNDI的使用、112各种EJB之间的调用、B-S结构EJB、 C-S结构EJB、UML建模与J2EE开发、RMI and RMI-...
内容有:简单的EJB、无状态SessionBean、有状态SessionBean、BMP位图实例、cmp实例、Message-Driven Bean、JNDI的使用、112各种EJB之间的调用、B-S结构EJB、 C-S结构EJB、UML建模与J2EE开发、RMI and RMI-...
最初,RMI 提供了基础的远程方法调用能力,随着时间的推移,它演进成了 RMI-IIOP,这是一种基于 Internet Inter-ORB Protocol (IIOP) 的 RMI 扩展,能够更好地与其他系统(例如 CORBA)进行互操作。此外,RMI 和 RMI...
为了提高RMI的互操作性,RMI-IIOP(Internet Inter-ORB Protocol)规范允许RMI通信使用CORBA(Common Object Request Broker Architecture)协议。 在Java RMI中,远程对象需要实现一个远程接口(Remote Interface...
本实例和相关资料旨在深入理解并实践Java CORBA的核心概念。 首先,我们需要理解CORBA的核心理念:对象请求代理(ORB)。ORB是CORBA系统的心脏,它负责对象间的通信,将对象的调用转换为网络消息,然后将结果返回给...
`java.rmi.activation`用于激活对象,`java.rmi.dgc`涉及分布式垃圾收集,`java.rmi.registry`是RMI网络命名服务的API,`java.rmi.server`提供服务器端操作的支持,`java.rmi`和`java.rmi.CORBA`则与RMI-IIOP(RMI...
它可能会涵盖常见问题,如处理异常、优化性能、使用RMI-IIOP(RMI over IIOP,一种在CORBA基础设施上运行RMI的方式)以及与Java Naming and Directory Interface (JNDI)的集成。 总的来说,RMI是Java平台上的一个...
- 使用RMI-IIOP(RMI over IIOP,即CORBA)可以跨平台通信,并支持更多的安全特性。 - 可以通过调整RMI的超时、重试策略等参数,优化远程调用的性能。 5. **应用领域**: - RMI常用于构建分布式应用,如数据库...
- RMI-IIOP:RMI可以与CORBA(Common Object Request Broker Architecture)集成,使用IIOP协议进行通信。 - RMI与JavaSpaces:结合JavaSpaces,RMI可以用于构建分布式计算和数据共享环境。 通过学习和理解这些...
- Java RMI-IIOP(Java Remote Method Invocation via the Internet Inter-ORB Protocol):支持CORBA标准。 - Java Web Start:结合Java RMI,可以实现更丰富的客户端-服务器交互。 - JMS(Java Message Service...