CORBA介绍及编程实例
一. CORBA的介绍
CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规范。或者说 CORBA体系结构是对象管理组织(OMG)为解决分布式处理环境中,硬件和软件系统的互连而提出的一种解决方案。
二. CORBA 体系结构概述
CORBA规范充分利用了现今软件技术发展的最新成果,在基于网络的分布式应用环境下实现应用软件的集成,使得面向对象的软件在分布、异构环境下实现可重用、可移植和互操作。其特点可总结为如下几个方面:
- 引入中间件作为事务代理,以完成客户机向服务对象方提出的业务请求。
- 实现客户与服务对象的完全分开,客户不需要了解服务对象的实现过程以及具体位置。
- 提供软总线机制,使得在任何环境下、采用任何语言开发的软件只要符合接口规范的定义,均能够集成到分布式系统中。
- CORBA 规范软件采用面向对象的软件实现方法开发应用系统,实现对象内部细节的完整封装,保留对象方法的对外接口定义。
三. IDL(接口定义语言)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 module HelloApp{ 2 interface Hello{ 3 string sayHello(in string name); 4 }; 5 };
编译Hello.idl。Java JDK提供了对CORBA的支持,Java IDL,即idlj编译器就是一个ORB,可用来在Java语言中定义、实现和访问CORBA对象。
具体步骤,在cmd中执行下面命令为接口定义文件生成客户端本地代理和服务器框架。
idlj -oldImplBase -fall Hello.idl (注意:在执行命令之前要将目录转移到该文件所在位置,或将该idl文件拷贝到Java jdk的bin目录下。)
然后,将生成的HelloAPP文件夹内所有文件导入到IDE编辑器。如图:
编写服务对象程序HelloImpl.java,该类继承了生成文件中的类_HelloImplBase。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package org.ngweg.corba; 2 3 import HelloApp._HelloImplBase; 4 5 public class HelloImpl extends _HelloImplBase { 6 private static final long serialVersionUID = 1L; 7 8 @Override 9 public String sayHello(String name) { 10 System.out.println("Acceptin client call: " + name); 11 return "Hello, " + name; 12 } 13 }
服务端程序HelloServer
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package org.ngweg.corba; 2 3 import org.omg.CORBA.ORB; 4 import org.omg.CosNaming.NameComponent; 5 import org.omg.CosNaming.NamingContext; 6 import org.omg.CosNaming.NamingContextHelper; 7 8 public class HelloServer { 9 10 public static void main(String args[]) { 11 try { 12 String[] init = {"-ORBInitialPort","1234"}; 13 // ORB initial 14 ORB orb = ORB.init(init, null); 15 16 // Register a instance of HelloImpl 17 HelloImpl helloImpl = new HelloImpl(); 18 orb.connect(helloImpl); 19 20 // Get the context 21 org.omg.CORBA.Object obRef = orb 22 .resolve_initial_references("NameService"); 23 NamingContext ncRef = NamingContextHelper.narrow(obRef); 24 25 // Binding 26 NameComponent nc = new NameComponent("Hello", ""); 27 NameComponent path[] = { nc }; 28 ncRef.rebind(path, helloImpl); 29 30 // waiting for client call. 31 System.out.println("Starting CORBA success."); 32 java.lang.Object sync = new java.lang.Object(); 33 synchronized (sync) { 34 sync.wait(); 35 } 36 } catch (Exception e) { 37 System.err.println("Starting CORBA fails. " + e); 38 } 39 } 40 }
客户端程序HelloClient
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package org.ngweg.corba; 2 3 import org.omg.CORBA.ORB; 4 import org.omg.CosNaming.NameComponent; 5 import org.omg.CosNaming.NamingContext; 6 import org.omg.CosNaming.NamingContextHelper; 7 8 import HelloApp.Hello; 9 import HelloApp.HelloHelper; 10 11 public class HelloClient { 12 public static void main(String args[]) { 13 try { 14 String[] init = {"-ORBInitialPort","1234"}; 15 // ORB initial 16 ORB orb = ORB.init(init, null); 17 18 // Get the context 19 org.omg.CORBA.Object obRef = orb 20 .resolve_initial_references("NameService"); 21 NamingContext ncRef = NamingContextHelper.narrow(obRef); 22 23 NameComponent nc = new NameComponent("Hello", ""); 24 NameComponent path[] = { nc }; 25 26 Hello hello = HelloHelper.narrow(ncRef.resolve(path)); 27 System.out.println(hello.sayHello("ZhangZijian")); 28 } catch (Exception e) { 29 System.out.println("Calling CORBA fails." + e); 30 } 31 32 } 33 }
至此,程序部分编写完毕,但是要执行该实例,必须要启动命名服务。
根据代码中设置的端口号,启动该服务,在命令行输入:tnameserv -ORBInitialPort 1234 即可。
然后分别运行Server端和Client端程序。
五. 实例2
定义一个接口StudentManager,该接口有long类型的属性id(只读)、string类型 name和一个返回类型为string的方法QueryStudentStatus,该方法包含一个参数studentID, 参数值由客户端给入。
编写IDL文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 module StudentSystem{ 2 interface StudentManager{ 3 readonly attribute long Id; 4 typedef string Name; 5 string QueryStudentStatus(in long studentId); 6 }; 7 };
使用idlj编译器生成相应文件,执行命令为:idlj -oldImplBase -fall student.idl
拷贝相应文件到编辑器,编写实现类的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package org.corba; 2 3 import StudentSystem._StudentManagerImplBase; 4 5 public class studentImpl extends _StudentManagerImplBase{ 6 7 private static final long serialVersionUID = 1L; 8 private int id; 9 private String name; 10 11 public studentImpl(int id){ 12 this.id = id; 13 } 14 15 16 public int getId() { 17 return this.id; 18 19 } 20 21 public String getName() { 22 return this.name; 23 } 24 25 public void setName(String name) { 26 this.name = name; 27 28 } 29 30 @Override 31 public int Id() { 32 return 0; 33 } 34 35 @Override 36 public String QueryStudentStatus(int studentId) { 37 if(this.getId() == studentId) 38 { 39 return this.getName(); 40 } 41 else{ 42 return null; 43 } 44 } 45 46 47 }
服务器端:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package org.corba; 2 3 import org.omg.CORBA.ORB; 4 import org.omg.CosNaming.NameComponent; 5 import org.omg.CosNaming.NamingContext; 6 import org.omg.CosNaming.NamingContextHelper; 7 8 public class server { 9 10 public static void main(String[] args) { 11 try{ 12 String[] init = {"-ORBInitialPort","1234"}; 13 ORB orb = ORB.init(init,null); 14 studentImpl stu = new studentImpl(12); 15 stu.setName("zhangsan"); 16 orb.connect(stu); 17 org.omg.CORBA.Object obRef = orb 18 .resolve_initial_references("NameService"); 19 NamingContext ncRef = NamingContextHelper.narrow(obRef); 20 NameComponent nc = new NameComponent("StudentManager",""); 21 NameComponent path[] = { nc }; 22 ncRef.rebind(path, stu); 23 System.out.println("Starting CORBA success." ); 24 java.lang.Object sync = new java.lang.Object(); 25 synchronized (sync) { 26 sync.wait(); 27 } 28 29 }catch(Exception e){ 30 System.err.println("Starting CORBA fails. " + e); 31 } 32 33 34 } 35 36 37 }
客户端:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package org.corba; 2 3 import org.omg.CORBA.ORB; 4 import org.omg.CosNaming.NameComponent; 5 import org.omg.CosNaming.NamingContext; 6 import org.omg.CosNaming.NamingContextHelper; 7 8 import StudentSystem.StudentManager; 9 import StudentSystem.StudentManagerHelper; 10 11 public class client { 12 13 public static void main(String[] args) { 14 try{ 15 String[] init = {"-ORBInitialPort","1234"}; 16 ORB orb = ORB.init(init, null); 17 org.omg.CORBA.Object obRef = orb 18 .resolve_initial_references("NameService"); 19 NamingContext ncRef = NamingContextHelper.narrow(obRef); 20 NameComponent nc = new NameComponent("StudentManager", ""); 21 NameComponent path[] = { nc }; 22 StudentManager sm = StudentManagerHelper.narrow(ncRef.resolve(path)); 23 System.out.println(sm.QueryStudentStatus(12)); 24 25 }catch(Exception e){ 26 System.out.println("Calling CORBA fails." + e); 27 } 28 29 } 30 31 }
项目结构图如下:
然后,通过相应命令启动服务,执行代码得出运行结果。