走在架构师的大道上 Jack.Wang's home

Java, C++, linux c, C#.net 技术,软件架构,领域建模,IT 项目管理 Dict.CN 在线词典, 英语学习, 在线翻译

BlogJava 首页 新随笔 联系 聚合 管理
  195 Posts :: 3 Stories :: 728 Comments :: 0 Trackbacks

       1)首先要熟悉idl语言,这个是专门进行接口设计的语言,它与java没关系,有自己的语法,具体的规则需要大家自己再网上研究,这里不多说了(或者访问如下网站详细察看http://www.iona.com/support/docs/manuals/orbix/33/html/orbix33cxx_pguide/IDL.html)。

module HelloApp
{
  
 interface Hello
    {
        string sayHello();
        oneway void shutdown();
     };
};

这 里定义了一个简单的interface, 将其保存为hello.idl, 然后再dos命令框里面输入 idlj.exe -fall hello.idl 编译。之后会出现一个叫做HelloApp的目录,corba就是通过这个目录里面的类来进行c-s之间的数据沟通。

      2)下一步,就是我们的server端:

// A server for the Hello object

import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;
import java.util.Properties;

public class HelloServer {

  public static void main(String args[]) {
    try{
      // create and initialize the ORB
      ORB orb = ORB.init(args, null);

      // get reference to rootpoa & activate the POAManager
      POA rootpoa =
        (POA)orb.resolve_initial_references("RootPOA");
      rootpoa.the_POAManager().activate();

      // create servant and register it with the ORB
      HelloImpl helloImpl = new HelloImpl();
      helloImpl.setORB(orb);

      // get object reference from the servant
      org.omg.CORBA.Object ref =
        rootpoa.servant_to_reference(helloImpl);


      // and cast the reference to a CORBA reference
      Hello href = HelloHelper.narrow(ref);
  
      // get the root naming context
      // NameService invokes the transient name service
      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);

      // bind the Object Reference in Naming
      String name = "Hello1";
      NameComponent path[] = ncRef.to_name( name );
      ncRef.rebind(path, href);

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

      // wait for invocations from clients
      orb.run();
    }
 
      catch (Exception e) {
        System.err.println("ERROR: " + e);
        e.printStackTrace(System.out);
      }
  
      System.out.println("HelloServer Exiting ...");
 
  } //end main
} // end class

将其保存为HelloServer.java.放在刚才的hello.idl的目录。编译这个文件就不多说了。

       3)还记得在hello中定义的interface吗?我们需要对自己定义的接口中的方法进行实现,因此HelloImp.java

// The servant -- object implementation -- for the Hello
// example.  Note that this is a subclass of HelloPOA, whose
// source file is generated from the compilation of
// Hello.idl using j2idl.

import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;

import java.util.Properties;

class HelloImpl extends HelloPOA //必须继承这个类,在helloApp目录中已自动生成

 {
  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);
  }
} //end class
同样放在server所在目录中。

      4)接下来是客户端(HelloClient.java):

// A sample Java IDL object client application.
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;

public class HelloClient
{
  static Hello helloImpl;
  String [] x=new String[6];
  public static void main(String args[]){
     try{
        // create and initialize the ORB
      ORB orb = ORB.init(args, null);

        System.out.println("ORB initialised\n");

        // get the root naming context
        org.omg.CORBA.Object objRef =
      orb.resolve_initial_references("NameService");

        // Use NamingContextExt instead of NamingContext,
        // part of the Interoperable naming Service. 
        NamingContextExt ncRef =
          NamingContextExtHelper.narrow(objRef);
 
        // resolve the Object Reference in Naming
        String name = "Hello1";
        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);
   }
  } //end main

} // end class


这个文件最好放在一个新建的目录,已表示和server有区别,放在一起也没有关系。如果分开的话,记着把HelloApp这个目录复制到client的目录来。

5)好啦!已经可以开始爽了,我们编译所有的java文件

6)再dos窗口输入orbd.exe –ORBInitialPort 1234(端口号可以自定义,但是记得s-c要保持一致),启动corba服务。

7)启动服务器:java HelloServer –ORBInitialPort 1234 –ORBInitialHost localhost

8)启动客户端:java HelloClient –ORBInitialPort 1234 –ORBInitialHost localhost

9)严格执行上述过程是应该直接成功的。 已经经过测试。

10)然后再仔细研究这段代码,你就会发现corba的奥秘了。
 From: http://www.javaeye.com/topic/136691



本博客为学习交流用,凡未注明引用的均为本人作品,转载请注明出处,如有版权问题请及时通知。由于博客时间仓促,错误之处敬请谅解,有任何意见可给我留言,愿共同学习进步。
posted on 2008-04-26 21:13 Jack.Wang 阅读(8914) 评论(9)  编辑  收藏 所属分类: 开发技术

Feedback

# re: Java Corba 2008-04-26 22:25 隔叶黄莺
第一行是 idl 语言,不是 idlj 语言,接口定义语言
jdk 提供的 orb 比较简陋,学习用用,实际项目都会选别的 orb 产口。我原来用的好像是 orabcus。corba 规范定义了一系列的服务,如 命名、事件、通知、生命、持久性对象、事务服务等。

corba 中的对象理解起来并不是那么容易,它当初由 OMG 组织提出是为异种平台、语言进行通行。但是由 idl 对于每一种语言要映射生成独有的一套接口代码来也是很烦的。

然而现在一切都变得简单多了,有 webservice,就是语言平台无关性的东西,还不象 corba 那样要考虑防火墙,所以现在大热的是 SOA、SCA、ESB 等。

corba 大约还会在电信网管产品中使用,IIOP 是由 corba 衍生的一种协议,用于 Internet 的互操作协议。现在企业应用基本见不着 corba 的影子了。

说真的,很多的程序员都还没用过 EJB,也不知道 EJB 长什么样子的,Hibernate/Spring 横空出世了。更别提 cobar 那个老古懂。
  回复  更多评论
  

# re: Java Corba 2008-04-27 08:26 Jack.Wang
学习了  回复  更多评论
  

# re: Java Corba 2008-04-30 13:16 java-he
不是很了解corba 。不过以前一个产品用了corba ,用了2年不是很稳定。后都改成了C++。  回复  更多评论
  

# re: Java Corba 2009-02-05 23:35 gavin.zheng
纠正一下
首先:目前常用的rpc有以下几种, corba rmi soap(soa)
1,corba最高效,使用的是c编码解码,而且现在所有的服务器间通信基本上都是它
2,以前的rmi最快,但不能不同种服务器通信,因为它是传诵的jvm内部数据结构,为了能够进行任何语言通信,避免跟当时的大部分企业产生分歧,它修改了它的地层协议,现在是封装corba通信, 当然 以前的协议照样使用
3,soap现在成了soa的事实标准, 但是这只能作为不同公司直接进行数据交流,xml解析是非常大的性能问题,特别是在集群上,不可能允许使用soap,比如mysql jboss的集群引擎,全部是corba

我想说的是: corba不可能过时,至少在目前,没有任何技术在性能上可以超越它  回复  更多评论
  

# 你们懂不懂corba?? 2009-03-15 13:32 thui
首先corba是一个协议,和语言和平台无关,
不是很了解corba 。不过以前一个产品用了corba ,用了2年不是很稳定。后都改成了C++-------这句话一看就是外行

1,corba最高效,使用的是c编码解码,而且现在所有的服务器间通信基本上都是它
---这句话也是,你调查过,都用corba????胡说八道  回复  更多评论
  

# re: Java Corba 2009-06-05 14:24 wm
@thui
1.Corba不会过时,国内用的少,可能几乎没有,就感觉过时了,这是一个误导现象。
2.国外电信产品中使用比较广泛,原因因为它是一个相对比较稳定的产品,一般C或者C++的通信用的比较多;还有因为国外的电信产品,他组成比较复杂,一部分是Java一部分是C/C++,那怎么通信呢?当然是Corba,因为它是跨平台跨语言的。  回复  更多评论
  

# re: Java Corba 2009-10-07 12:13 yinzhao0509
博主,在1.6下调试通不过,而且idlj.exe编译出的文件也和文中有所不同!  回复  更多评论
  

# re: Java Corba 2013-04-22 17:44 JAVAdel
讲的很好很清楚  回复  更多评论
  

# re: Java Corba 2014-10-31 17:08 skc
@java-he
你好 能具体说明一下,C++代替CORBA的原理吗  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: