CORBA版HelloWorld

CORBA,是一个很古老的技术,甚至诞生于Java之前,不过随着WebService、SOA、RMI等等技术的出现,CORBA由于过于复杂而渐渐淡出了人们的视线,不过在一些交互性很强的系统异构应用领域,CORBA似乎很重要,比如中国联通、移动、美国的数字电视系统应用领域,是CORBA把整个系统核心部分集成起来的。如果没有异构的、需要预留标准接口的、交互性很强的应用,你不应该考虑使用COBRA。

  CORBA目前的最近版本规范是3.2,Java1.5、1.6均支持该版本。

  CORBA比较亲和C++,对Java程序员来说,开始CORBA应用难度比较大,以至于网上找一个真正能跑的HelloWorld都很难。

  下面是我经过阅读SUN的CORBA文档,所做的一个完整的HelloWorld实例:

  一、定义IDL

  module HelloApp{

  interface Hello{

  string sayHello();

  oneway void shutdown();

  };

  };

  没有IDL的专门的开发工具,写起来容易出错,而且不美观,IDEA勉强支持语法高亮,但不支持格式化和语法校验!

  二、从IDL生成存根

  进入IDL文件存放目录,然后执行:idlj -fall Hello.idl

  会生成一批Java文件:

  helloCorba\src\HelloApp

  HelloPOA.java

  _HelloStub.java

  HelloHolder.java

  HelloHelper.java

  Hello.java

  HelloOperations.java

  三、实现IDL接口,开发服务端程序

import HelloApp.Hello;
import HelloApp.HelloHelper;
import HelloApp.HelloPOA;
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;

class HelloImpl extends HelloPOA {
private ORB orb;


public void setORB(ORB orb_val) {
orb = orb_val;
}

// implement sayHello() method

public String sayHello() {

return "\nHello world !!\n";

}

// implement shutdown() method

public void shutdown() {

orb.shutdown(false);

}

}

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();

// create servant and register it with the ORB

//创建一个HelloImpl实例(servant),并注册到ORB上

HelloImpl helloImpl = new HelloImpl();

helloImpl.setORB(orb);

//从服务中得到对象的引用

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");

// Use NamingContextExt which is part of the Interoperable

// Naming Service (INS) specification.

NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

//在命名上下文中绑定这个对象

String name = "Hello";

NameComponent path[] = ncRef.to_name(name);

ncRef.rebind(path, href);

System.out.println("HelloServer ready and waiting ...");

//启动线程服务,等待客户端的调用

orb.run();

}catch (Exception e) {

System.err.println("ERROR: " + e);

e.printStackTrace(System.out);

}

System.out.println("HelloServer Exiting ...");

}

}

  四、实现CORBA的客户端

  import HelloApp.Hello;

  import HelloApp.HelloHelper;

  import org.omg.CORBA.ORB;

  import org.omg.CosNaming.NamingContextExt;

  import org.omg.CosNaming.NamingContextExtHelper;

  public class HelloClient {

  static Hello helloImpl;

  public static void main(String args[]) {

  try {

  //创建一个ORB实例

  ORB orb = ORB.init(args, null);

  //获取根名称上下文

  org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");

  // Use NamingContextExt instead of NamingContext. This is

  // part of the Interoperable naming Service.

  NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

  //从命名上下文中获取接口实现对象

  String name = "Hello";

  helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));

  //调用接口对象的方法

  System.out.println("Obtained a handle on server object: " + helloImpl);

  System.out.println(helloImpl.sayHello());

  helloImpl.shutdown();

  } catch (Exception e) {

  System.out.println("ERROR : " + e);

  e.printStackTrace(System.out);

  }

  }

  }

  五、运行

  1)运行CORBA服务

  orbd -ORBInitialPort 1050 -ORBInitialHost 192.168.14.117

  2)运行CORBA应用的服务端

  java HelloServer -ORBInitialPort 1050

  输出:

  HelloServer ready and waiting ...

  HelloServer Exiting ...

  3)运行CORBA应用的客户端

  java HelloClient -ORBInitialHost 192.168.14.117 -ORBInitialPort 1050

  Obtained a handle on server object: IOR:000000000000001749444c3a48656c6c6f4170702f48656c6c6f3a312e30000000000001000000000000008a000102000000000f3139322e3136382e31342e313137000006db000000000031afabcb00000000206d3bb80000000001000000000000000100000008526f6f74504f410000000008000000010000000014000000000000020000000100000020000000000001000100000002050100010001002000010109000000010001010000000026000000020002

  Hello world !!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值