Java编写CORBA的一个简单例子(CORBA入门)

转载 2012年03月29日 01:05:04

原帖请参考:http://blog.sina.com.cn/s/blog_54a96e8701009g17.html

入门参考,很不错

最近写毕业论文学习CORBA,看了几天的理论.今天在网上搜了个HelloCORBA的小程序,调试了一下,弄明白了一些概念和原理.人的记忆力是有限的,特开博将过程写下来.供以后参考.

    写一个CORBA程序的步骤:   

    1. 编写IDL接口定义文件; 
    2. 将接口定义文件编译为相应高级语言源代码,产生服务器框架与客户端存根; 
    3. 基于服务器框架,编写服务对象实现程序;
    4. 基于客户端存根,编写客户对象调用程序; 
    5. 分别编译客户对象和服务对象程序; 
    6. 运行服务对象和客户对象程序;

    这个步骤网上COPY的,比较笼统.不过程序根据步骤一步一步来还是很好写的.

写一个Hello,CORBA的小程序

1. 编写IDL接口定义文件

 文件名:Hello.idl

 module HelloApp{

    interface Hello{

      string sayHello(in string sayHello);

    }

}

程序解释:定义一个模块 HelloApp,这个相当于JAVA里面的包.然后定义了一个接口Hello,该接口包含一个方法sayHello,用来显示Hello,CORBA

2. 将接口定义文件编译为相应高级语言源代码,产生服务器框架与客户端存根; 
Java IDL 即是CORBA 的一个实现,它是JDK1.3 或更高版本的核心软件包之一,定义在org.omg.CORBA及其子包中。我们利用JAVA提供的IDL编译工具对IDL文件进行编译.

idlj -oldImplBase -fall Hello.idl

先解释一下参数的意思.-oldImplBase 表示生成与旧(1.4 版之前)JDK ORB 兼容的框架.-f 是定义要发出的绑定。-fall表示绑定所有.包括客户端和服务器端.

编译后会产生六个文件,文件的意义从别的网站COPY过来了

n _HelloImplBase.java
   该抽象类是一个服务器 skeleton,它可为服务器提供基本的 CORBA 功能。它实现 Hello.java 接口。服务器类 HelloServant 扩展 _HelloImplBase。
n _HelloStub.java
    该类是客户机 stub,可为客户机提供 CORBA 功能。它实现 Hello.java 接口。
n Hello.java
    该接口含有 IDL 接口的 Java 版本。Hello.java 接口扩展 org.omg.CORBA.Object 并提供标准的 CORBA 对象功能。
n HelloHelper.java
    这是一个终态类,可以提供辅助功能,特别是提供将 CORBA 对象引用转换为适当类型所需的 narrow() 方法。
n HelloHolder.java
   这是一个终态类,其中含有 Hello 类型的公有实例成员。它可为“out” 和 “inout” 变量提供操作。CORBA 有这些变量,但不容易映射为 Java 的语义。
n HelloOperations.java
   这是一个接口类,其中含有方法 sayHello()。
生成了相应的代码后,接下来对Hello接口进行实现,该类继承_HelloImplBase类.因为_HelloImplBase类是对HELLO接口的一个抽象的实现.新建一个HelloImpl.java文件,用来实现HELLO接口
 HelloImpl.java

import HelloApp.*;

public class HelloImpl extends _HelloImplBase
{
  HelloImpl()
  {
    super();
  } 
  public String sayHello(String message)
  {
    System.out.println("It's server,clint is invoking..");
    System.out.println("Hello"+message);
    return message;
  }
}

 
实现Hello接口后,接下来就是对服务器端和客户端分别编写相应的代码
3. 基于服务器框架,编写服务对象实现程序;
服务器端程序编写的步骤
1. 创建一个 ORB 实例 
2. 创建一个HelloImpl实例(CORBA Hello对象的实现)并通知 ORB 
3. 获取一个命名上下文的 CORBA 对象引用,在该命名上下文中注册新 CORBA 对象 
4. 在命名上下文中将新对象注册在“Hello”名下 
5. 等待对新对象的调用
按此步骤写一个HelloServer.java的程序
 HelloServer.java

 import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class HelloServer
{
 public static void main(String args[]){
  try{
    //初始化ORB
    ORB orb=ORB.init(args,null);
    System.out.println("ORB initial...");
    //创建一个实例,并向ORB注册
    HelloImpl helloImpl = new HelloImpl();
    orb.connect(helloImpl);
    System.out.println("将实例注册到ORB");
    //获取一个命名上下文
    org.omg.CORBA.Object obRef = orb.resolve_initial_references("NameService");
    NamingContext ncRef = NamingContextHelper.narrow(obRef);
    //绑定命名中的对象引用
    NameComponent nc = new NameComponent("Hello","");
    NameComponent path[] = { nc };
    ncRef.rebind(path, helloImpl);
    //等待客户机的调用
    java.lang.Object sync = new java.lang.Object();
              synchronized (sync) {
                  sync.wait();
              }
              System.out.println("等待CORBA客户端调用...");
          } catch (Exception e) {
              System.err.println("错误: " + e);
              e.printStackTrace(System.out);
          }
   }

}

 

4. 基于客户端存根,编写客户对象调用程序;

 HelloClient.java

 //· 创建一个 ORB
//· 获取一个指向命名上下文的引用
//· 在命名上下文中查找 "Hello" 并获得指向该 CORBA 对象的引用
//· 调用对象的 sayHello() 操作并打印结果

import org.omg.CosNaming.*;
import org.omg.CORBA.*;
import HelloApp.*;

public class HelloClient
{
 public static void main(String args[]){
   try{
   ORB orb = ORB.init(args,null);
   System.out.println("ORB initial...");
   //获取一个命名上下文
    org.omg.CORBA.Object obRef = orb.resolve_initial_references("NameService");
    NamingContext ncRef = NamingContextHelper.narrow(obRef);
   
      NameComponent nc = new NameComponent("Hello", "");
      NameComponent path[] = { nc };
      Hello h = HelloHelper.narrow(ncRef.resolve(path));
      System.out.println("我在客户端,开始调用CORBA服务器端的'sayHello'方法");
            System.out.println("欢迎,  " +  h.sayHello("javamxj blog"));
    }catch (Exception e) {
            System.out.println("错误 : " + e);
            e.printStackTrace(System.out);
        }
      
 }
}

 

5. 分别编译客户对象和服务对象程序; 

程序写好后,接下来就是对程序的编译了,先做如下的准备工作.将上面编写的四个文件复制到一个新文件夹,如d:/HelloCorba

编译Hello.idl

 D:\HelloCorba>idlj -oldImplBase -fall Hello.idl

这会生成一个HelloApp的目录
再对所有的JAVA文件进行编译
D:\HelloCorba>javac *.java HelloApp/*.java
编译中如果有问题,那代表程序中有些地方不正确,根据相应提示修改一下就可以了
接下来就可以运行程序了.为了看执行效果,将服务器端和客户端代码分开
新建一个SERVER的文件夹,再建一个CLIENT的文件夹用来表示服务器和客户.
分别在Client和Server目录下建立HelloApp子目录,将D:\CorbaSample\HelloApp目录中的  
     _HelloStub.class
     Hello.class
     HelloHelper.class
     HelloHolder.class
     HelloOperations.class
复制到D:\CorbaSample\Client\HelloApp目录下,再将D:\CorbaSample目录中的HelloClient.class复制到D:\CorbaSample\Client目录下。
 
   将D:\CorbaSample\HelloApp目录中的
     _HelloImplBase.class
     Hello.class
     HelloOperations.class
复制到D:\CorbaSample\Server\HelloApp目录下,再将D:\CorbaSample目录中的HelloServer.class和 HelloImpl.class 复制到D:\CorbaSample\Server目录中

确保名字服务器处于运行状态:

      D:\HelloCorba\Server>tnameserv -ORBInitialPort 1050

· 启动 Hello 服务器:
     D:\HelloCorba\Server>java HelloServer -ORBInitialPort 1050
 
· CORBA客户端调用CORBA服务:
     D:\HelloCorba\Client>java HelloClient -ORBInitialPort 1050
这样程序就可以运行了
如果调试过程中有什么问题,可以留言给我

Java corba 实例

.NET 和 Java 在技术布局上非常类似,.NET 的远程调用经历了DCOM,.NET Remoting,最后是几乎成了.NET 平台SOA代名词的WCF.WCF的目标在于通过一种通用简单的协议来...
  • afandaafandaafanda
  • afandaafandaafanda
  • 2015年01月23日 12:03
  • 1953

使用java和CORBA实现分布应用编程

因为课程的需要,学习了下用java和CORBA来实现分布应用编程,具体的CORBA是什么以及它的框架结构我就不多说了,这里我是给出一个比较完整的例子来展示下代码要怎么写。应用背景:使用java和COR...
  • ancientmoondjay
  • ancientmoondjay
  • 2017年05月07日 21:26
  • 830

亲身体验CORBA: 使用java和C++混合编程

文作者通过一次使用SUN的 tnameserv命名服务程序,服务器用JAVA编写,客户机分别用JAVA和C++(VC6+omniORB)编写的试验,希望通过一次编程的具体操作实例来体验或明了CORBA...
  • u011676589
  • u011676589
  • 2014年06月09日 15:02
  • 1416

C++、CORBA版HelloWorld程序

环境:Windows XP, MICO2.3.12, Visual Studio 2003 开发步骤: A 编译MICO B 设置VC开发环境 C 编写编译IDL接口 D 编写编译服务端程序...
  • u012719556
  • u012719556
  • 2014年01月23日 13:53
  • 1453

java构建简单的CORBA应用

本文转载自http://www.iteye.com/topic/174951,非常感谢原作者。 JAVA还提供了对CORBA(Common Object Request Broker Architec...
  • chjttony
  • chjttony
  • 2011年06月22日 16:35
  • 6255

Corba开发之基于Java实现Service与Client

1      概述 CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程 序体系规范...
  • vtopqx
  • vtopqx
  • 2015年11月15日 14:25
  • 1580

JAVA&CORBA详解

出处:http://blog.csdn.net/chszs/archive/2009/07/16/4353478.aspxJava IDL技术在Java平台上添加了CORBA(Common Objec...
  • zzd1990
  • zzd1990
  • 2010年12月07日 23:05
  • 1201

Corba开发之基于ior实现

1、概述: 在之前的文章中均已实现Corba环境配置、Eclipse简单开发实现; 在日常开发中,Corba接口远程调用与实现常用的方式有两种:ior(文件方式)和nameService(命名服务方式...
  • vtopqx
  • vtopqx
  • 2015年11月15日 14:56
  • 1875

基于CORBA的分布式程序设计(七)

第五章 基于CORBA的分布式软件开发5.1 分布式技术的基本原理5.1.1传统的面向对象分析与面向对象设计方法。 常规的OOA和OOD方法可以直接应用于分布式系统的分析和设计,然而传统的OOP环境(...
  • helloworlder
  • helloworlder
  • 2003年07月03日 14:08
  • 2305

RMI, RPC, CORBA区别

RMI 和 RPC均可以均提供远程方法访问的基础通信和参数引用要求的串行化机制,RPC和RMI之间的一个重要差别是RPC用快速而不够可靠的UDP协议,RMI用低速而可靠的TCP/IP协议。另外 RMI...
  • AbnerChai
  • AbnerChai
  • 2012年06月14日 11:02
  • 2115
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java编写CORBA的一个简单例子(CORBA入门)
举报原因:
原因补充:

(最多只允许输入30个字)