一、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