CORBA概要:
在一个通常的用C++或者JAVA写的面向对象的程序里,程序包含所有应用程序需要用到的类。编译器编译和连接这些对象,当你用new语句初始化对象时,它们被创建在应用程序所在的内存里并且被当作一个简单的过程来执行。
CORBA是一种技术允许一个Client程序调用属于一个Server的对象,这个Server可以是运行在同一台机器或者是几千里外的机器。在它的最基本的阶段,CORBA是非常简单的-实例化一个在你的处理内存空间的对象代替你在通常的程序中所做的,你可以实例化这个对象无论在哪一个网络的Server上。调用这个对象的方法以及这些方法需要传递的参数被打包成网络包的格式发送到服务器上。这个功能实际上是运行在服务器上,返回结果通过网络传递到调用者。
这种方案的优点是服务器可以作为高效的、共享的资源中心,以Server为基础的CORBA对象可以访问Server的数据库和其它服务。当然,它的缺点是速度。每秒调用功能的数目被网络速度严格限制,以便保证其它技术通过网络传输数据,因而,CORBA不是独仪无二的。DCOM,甚至Socket都要忍受同样的延迟。
用CORBA方法特别的方面是可以方便的调用ORB(Object Request Broker), ORB处理和操作Client和Server之间的连接。在下面的例子里我们将要用Inprise VisiBroker ORB。用VisiBroker,Client和Server都用一个叫做OSAGENT的服务,OSAGENT用一个标准的端口(通常是14000)连接Client,OSAGENT可以当作一个目录去帮助Client的ORB去找到一个它要找的对象。
用java设置一个简单的CORBA的Client和Server是非常简单的,在下面我们将要看到几段例子代码段去显示这个过程,在接下来的部分我们将要解释代码怎样工作的,我们从关键字"安装"开始。
用文档中的例子代码,除了VisiBroker ORB之外你需要下载Sun的JDK1.1,你能下载SDK从http://java.sun.com/products/jdk/1.1/index.html。我们用JDK1.1代替1.2是为了避免和java2的ORB冲突。你可以得到VisiBroker ORB从http://www.inprise.com/visibroker/。先装SDK,再装ORB。
例子代码
为了创建一个CORBA Server并且让Client访问它,你要决定Server类将要做什么再开始。在这个例子里我们要用一个非常简单的Server类,这个类拥有一个私有的整型变量,在这个类里的一个方法将要增加这个整型变量,并且另一个方法将要允许Client访问这个变量的正确值,下面是这个类的接口描述:
//Counter.idl
module Counter{
interface Count
void increment();
long getCounter();
这个类被命名为Count,它的两个方法是Increment和getCounter,这个类被包含在一个叫Counter的模板中,只要你愿意这个模板可以包含好几个不同的类,把这IDL代码放在一个叫Counter.idl名字的文件中。
为了用这个IDL文件,你需要IDL2JAVA去运行它,这个工具将要创Client和Server要用到的类,IDL2JAVA产生的Client类叫做Helper并且被命名为CountHelper.java,Client用helper类去调用Server的功能,IDL2JAVA产生的Server类叫做ImplBase并且被命名为_CountImpleBase.java,你将要执行这些Server扩展ImplBase的方法。
注意:当你在Client直接用CounterHelper.java类时,当你调用一个Counter接口的方法时执行在Client的代码是_st_Counter.java。这个类调用stub把数据打包发送到Server并且返回正确的数据,它同Server端的skeleton(是_sk_Counter.java,继承与_CounterImplBase.java)通信。
下一页
客户端代码是非常简单的,下面是你能创建的最小的客户端程序。
// Client.java
public class Client
public static void main(String[] args)
Counter.Count count = null;
org.omg.CORBA.ORB orb = null;
// Initialize the ORB
orb = org.omg.CORBA.ORB.init();
// Bind to the object on the server
count = Counter.CountHelper.bind(orb, "test");
// Call the server functions
count.increment();
System.out.println("Current Count = " + count.getCounter());
// clean up
count = null;
orb.shutdown();
在这段代码里你可以看到Client实例化ORB,绑定helper对象为了连接Server,接着开始调用方法,为了编译这段代码,储存文件名为Client.java并且输入:
vbjc Client.java
另外,为ORB可以加入三个jar文件到你的Class Path中并其用javac编译Client(三个jar文件是:vbjorb.jar,vbjapp.jar和vbjtools.jar)
假如你想让客户端代码发现问题并且告诉你,你要修改Client.java如下:
// Client.java
public class Client
public static void main(String[] args)
Counter.Count count = null;
org.omg.CORBA.ORB orb = null;
// Initialize the ORB
try
orb = org.omg.CORBA.ORB.init();
catch (org.omg.CORBA.SystemException se)
System.err.println("initializtion problem in the ORB " + se);
System.exit(1);
// Bind to the object on the server
try
count = Counter.CountHelper.bind(orb, "test");
catch (org.omg.CORBA.SystemException se)
System.err.println("Binding problem in the ORB " + se);
System.exit(1);
try
count.increment();
System.out.println("Current Count = " + count.getCounter());
catch (org.omg.CORBA.SystemException se)
System.err.println("Increment failure " + se);
System.exit(1);
// clean up
try
count = null;
orb.shutdown();
catch (org.omg.CORBA.SystemException se)
System.err.println("Problem with cleanup " + se);
System.exit(1);
当你初始化ORB并且绑定到Server时你有多个选项:
1.ORB可以从命令行中接受并且分析这些选项。
2.你可以设置绑定选项。
3.你可以直接连到一个指定的机器。
下面的代码段为你展示了这三个选项
orb = org.omg.CORBA.ORB.init(args, null);
org.omg.CORBA.BindOptions bindOptions = new
org.omg.CORBA.BindOptions();
bindOptions.defer_bind = false;
bindOptions.enable_rebind = true;
count = Counter.CountHelper.bind(orb, "test", "marshall.iftech.com",
bindOptions);
这是初始化从命令行中接受参数,绑定接受了一个指定的机器名和选项。
在Server你需要创建两段代码,一段为了Client绑定而且执行Count类(Count类继承与ImplBase类),如下所示:
// CountImpl.java
public class CountImpl extends Counter._CountImplBase
private int c = 0;
public CountImpl(String name) {
super(name);
public CountImpl() {
super();
public void increment() {
c = c + 1;
System.out.println(c);
public int getCounter()
return c;
这个类不能再少了,它的功能只是实现类里的方法,执行这个类的Server代码如下:
// Server.java
public class Server
public static void main(String[] args)
org.omg.CORBA.ORB orb = null;
org.omg.CORBA.BOA boa = null;
Counter.Count count = null;
try
orb = org.omg.CORBA.ORB.init(args, null);
catch (org.omg.CORBA.SystemException se)
System.err.println("Initialization problem in the ORB " + se);
System.exit(1);
try
boa = orb.BOA_init();
catch (org.omg.CORBA.SystemException se)
System.err.println("Initialization problem in the BOA " + se);
System.exit(1);
try
count = new CountImpl("test");
boa.obj_is_ready(count);
System.out.println(count + " ready.");
boa.impl_is_ready();
catch (org.omg.CORBA.SystemException se)
System.err.println("Ready problem " + se);
System.exit(1);
Server代码用Server.java保存,编译这个Serve.java:
? vbjc Serve