CORBA中传递对象 java语言

原创 2007年09月13日 10:22:00

CORBA的IDL数据类型定义了一系列的基本数据类型,但是如果需要传递对象可能就有些问题了。虽然IDL文件中的interface其实就是传递对象的一种方法,我的理解就是把要传递的对象的属性分成基本数据类型传递过去,但是如果传递的对象结构变化了,还需要修改IDL文件。所以想找到一个直接传递对象的方法,研究了CORBA定义的数据类型,最好的办法就是像很多连接传输对象的方法一样,传递byte数组。

建一个目录,名为Hello(名字随意起),然后在这个目录中建两个子目录,分别为server,client

在两个目录中各建一个People.java文件,内容如下:

import java.io.*;
class People implements Serializable
{
 private String name;
 private int age;

 public People()
 {
  name = "CY";
  age = 27;
 }

 public People(String str, int i)
 {
  name = str;
  age = i;
 }

 public String getName()
 {
  return name;
 }
 
 public int getAge()
 {
  return age;
 }

}

在server目录建一个Hello.idl文件,内容如下:

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

同样在server目录建HelloServer.java文件,内容如下:

// 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

在server目录下建立HelloImpl.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;
import java.io.*;

class HelloImpl extends HelloPOA //必须继承这个类,在helloApp目录中已自动生成
{
 private ORB orb;
  private byte[] bytes;
 public void setORB(ORB orb_val)
 {
  orb = orb_val;
 }

 // implement sayHello() method
 public byte[] sayHello()
 {
  return (ObjectToByte(new People("Chen Yi",27)));
 }

 // implement shutdown() method
 public void shutdown()
 {
  orb.shutdown(false);
 }
 public byte[] ObjectToByte(java.lang.Object obj)
 {

  try {
   //object to bytearray
   ByteArrayOutputStream bo = new ByteArrayOutputStream();
   ObjectOutputStream oo = new ObjectOutputStream(bo);
   oo.writeObject(obj);

   bytes = bo.toByteArray();

   bo.close();
   oo.close();

   
  }
  catch(Exception e) {
   System.out.println("translation"+e.getMessage());
   e.printStackTrace();
  }
  return(bytes);
 }

} //end class

在client目录下建立HelloClient.java文件,内容如下:

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

public class HelloClient
{
 static Hello helloImpl;
 String [] x=new String[6];
 static People people;
 static java.lang.Object obj;
 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));

      people = (People)(ByteToObject(helloImpl.sayHello()));

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

  }
  catch (Exception e) {
   System.out.println("ERROR : " + e) ;
   e.printStackTrace(System.out);
  }
 } //end main

 private static java.lang.Object ByteToObject(byte[] bytes){
  try {
  //bytearray to object
  ByteArrayInputStream bi = new ByteArrayInputStream(bytes);
  ObjectInputStream oi = new ObjectInputStream(bi);

  obj = oi.readObject();

  bi.close();
  oi.close();
  }
  catch(Exception e) {
   System.out.println("translation"+e.getMessage());
   e.printStackTrace();
  }
  return obj;
 }
} // end class

下面是单机版编译步骤

1. 编译server中IDL文件,在命令行执行   idlj -fall HelloApp.idl

2. 编译server中.java文件  javac *.java

3. 将server中编译IDL文件后产生的文件目录HelloApp复制到client目录中

4. 编译client中.java文件  javac *.java

5. 运行orbd  start orbd -ORBInitialPort 1050

6. 运行server  start java HelloServer -ORBInitialPort 1050 -ORBInitialHost localhost

7. 运行client  java HelloClient -ORBInitialPort 1050 -ORBInitialHost localhost

运行结果,会在client命令行中看到打印出人名.如果需要进一步测试,可以在HelloImpl中修改new People(str,i)的参数也可以在client中调用People的其他方法.

多机版运行方法
编译方法同单机版
1. 运行orbd   start orbd -ORBInitialPort 1050 -ORBInitialHost servermachinename

2. 运行server   java HelloServer -ORBInitialPort 1050

3. 运行client   java HelloClient -ORBInitialHost nameserverhost -ORBInitialPort 1050

注意 nameserverhost 是服务器的IP地址

另外idlj命令的参数也可以修改, -fall是生成server和client的映射, -fserver是生成server映射, -fclient是生成client映射.如果用后面两个参数需要将.idl文件分别放在两个目录中

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

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

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

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

对象中间件--CORBA开发练习

通过实例掌握CORBA的开发过程:主要包括:接口定义;接口的对象实现;服务器端代码编写;客户端代码编写;CORBA Server/Client的编译与运行; 1)基于CORBA技术开发一个考试成绩查询...
  • u011402642
  • u011402642
  • 2015年06月11日 14:39
  • 1280

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

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

Java 值传递和对象传递详解

1、需要明白的概念: 堆和栈:Java中基本数据类型的值和对象的引用保存在栈中,具体对象值保存在堆中。传递原理: 一个方法传递的参数如果是基本数据类型,则是对具体值的拷贝;如果是对象数据类型,则是...
  • yushanfenghailin
  • yushanfenghailin
  • 2016年05月12日 17:46
  • 2342

CORBA的简单介绍及HelloWorld

CORBA概述 CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程 序体系规范。或...
  • DryKillLogic
  • DryKillLogic
  • 2014年05月16日 16:31
  • 11527

Java —— 把对象传递给方法

首先创建了class Num的两个对象,将n1赋给n2。所以n1和n2有着相同的引用值,,它们都引用着同一对象。 对于method1方法来说,将n1的·值传递给了形参num,与n2和n1的关系同理。。...
  • sxtopc
  • sxtopc
  • 2017年02月28日 22:38
  • 221

Android JNI 传递对象

jni初步入门后,在传递数据的时候,遇到一个需求:有多个数据需要在java与c代码之间进行传递。如果都做为函数参数传入,则函数很长很难看,并且多个数据的返回也不好实现。所以想到了把数据打包后传递这在C...
  • lintax
  • lintax
  • 2016年06月25日 17:25
  • 1868

12-8java面向对象对象之引用传递

今天主要说明在面向对象操作中的引用传递情况。一句话,用面向对象设计可以解释生活中的所有问题。 1.对象数组 对象数组肯定是一个数组,回顾一下我们之前使用过的数组。 int a[] = null; 显然...
  • baobeizhanshen
  • baobeizhanshen
  • 2014年12月08日 19:59
  • 924

关于Java对象作为参数传递是传值还是传引用的问题

前言  在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题。若传的是值,那么函数接收的只是实参的一个副本,函数对形参的操作并不会对实参产生影响;若传的是引...
  • xiangwanpeng
  • xiangwanpeng
  • 2016年09月06日 22:37
  • 2192
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CORBA中传递对象 java语言
举报原因:
原因补充:

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