一、CORBA介绍
CORBA的具体概念就不介绍了,CORBA的主要作用如下:
1、支持多种编程语言,可用于不通语言之间的调用
2、远程分布式调用,结合前一点就可以实现多语言之间分布式计算
二、开发步骤
一般使用CORBA开发有以下几个步骤:
1、编写IDL文件,IDL,Interface Description Language,即接口描述语言(特有的一套语法),定义远程调用的接口并将其写成IDL文件。
2、将IDL文件生成服务端程序所使用编程语言的代码,在生成的代码基础上实现所提供接口的具体实现。在服务端注册提供的接口实现,并启动服务监听。
3、将IDL文件生成客户端程序所使用编程语言的代码,基于生成的代码和CORBA的API调用接口,CORBA将远程调用服务端的接口实现,并可以将调用结果返回给客户端程序。
三、示例
以下基于JAVA写一个简单的CORBA示例。
1、定义idl文件
创建一个hello.idl文件,内容如下:
module HelloApp { interface Hello { string sayHello(); }; };
2、生成骨架文件
在hello.idl所在目录,运行以下命令
idlj–fall hello.idl
将在同目录中生成一个HelloApp文件夹
idlj.exe是jdk中提供的文件,在%JAVA_HOME%\bin中
3、实现服务端
将HelloApp文件夹放入服务端工程中。
3.1、实现sayHello方法
创建服务端实现类HelloImpl.java,实现sayHello方法。
public class HelloImpl extends HelloPOA{ @Override public String sayHello() { return "Hello World"; } }
3.2、编写服务端监听代码
HelloServer.java
public class HelloServer { //启动ORB以及等待远程客户机的调用的代码 public static void main(String[] args) { try{ args = new String[2]; args[0] = "-ORBInitialPort"; args[1] = "1050"; // 创建一个ORB实例 ORB orb = ORB.init(args, null); // 得到一个RootPOA的引用,并激活POAManager org.omg.CORBA.Object obj = orb.resolve_initial_references("RootPOA"); POA rootpoa = POAHelper.narrow(obj); rootpoa.the_POAManager().activate(); // 创建一个HelloImpl实例 HelloImpl helloImpl = new HelloImpl(); // 从服务中得到对象的引用 org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref); // 得到一个根名称的上下文 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // 在命名上下文中绑定这个对象 String name = "Hello"; NameComponent path[] = ncRef.to_name(name); ncRef.rebind(path, href); // 启动线程服务,等待客户端调用 orb.run(); }catch(Exception e){ e.printStackTrace(); } } }
4、实现客户端
同样,将HelloApp文件夹放入客户端工程中(为了测试方便,客户端和服务端都写在同一个工程中了)。
创建HelloClient.java,编写客户端调用的代码。
public class HelloClient { public static void main(String[] args) { Hello helloImpl = null; String args[] = new String[4]; args[0] = "-ORBInitialHost"; args[1] = "127.0.0.1"; args[2] = "-ORBInitialPort"; args[3] = "1050"; try{ // 创建一个ORB实例 ORB orb = ORB.init(args, null); // 获取根名称上下文 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt neRef = NamingContextExtHelper.narrow(objRef); String name = "Hello"; //与服务端的名称对应 helloImpl = HelloHelper.narrow(neRef.resolve_str(name)); }catch(Exception e){ e.printStackTrace(); } String str = helloImpl.sayHello(); System.out.println(str); } }
5、启动服务端
5.1在服务端运行以下命令,启动orbd服务
orbd-ORBInitialPort 1050 -ORBInitialHost 127.0.0.1
其中参数与HelloServer中的对应
orbd.exe也是jdk中的
5.2运行HelloServer中的main方法
6、运行客户端
运行客户端HelloClient中的main方法进行调用测试
运行输出结果:
Hello World