当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

一个例子(CORBA)[Java编程]

赞助商链接



  本文“一个例子(CORBA)[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
这儿显示的代码大概并不细致,因为差别的ORB有差别的办法来拜候CORBA服务,所以无论什么例子都要取决于具体的厂商(下例利用了JavaIDL,这是Sun公司的一个免费产品.它配套供应了一个简化版本的ORB、一个命名服务以及一个“IDL→Java”编译器).除此之外,由于Java仍处在发展早期,所以在差别的Java/CORBA产品里并非包含了全部CORBA特点.
我们但愿实现一个服务器,令其在一些机械上运行,其他机械能向它查询精确的时间.我们也但愿实现一个客户,令其恳求精确的时间.在这种情形下,我们让两个程序都用Java实现.但在实际利用中,常常辨别采取差别的语言.

1. 编写IDL源码
第一步是为供应的服务编写一个IDL描写.这普通是由服务器程序员完成的.随后,程序员便可用任何语言实现服务器,只需那种语言里存在着一个CORBA IDL编译器.
IDL文件已分发给客户端的程序员,并成为两种语言间的桥梁.
下面这个例子展示了时间服务器的IDL描写情形:
module RemoteTime {
   interface ExactTime {
      string getTime();
   };
};

这是对RemoteTime命名空间内的ExactTime接口的一个声明.该接口由单独一个办法构成,它以字串格局返回当前时间.

2. 成立根干
第二步是编译IDL,成立Java根干代码.我们将操纵这些代码实现客户和服务器.与JavaIDL产品配套供应的工具是idltojava:
idltojava -fserver -fclient RemoteTime.idl
此中两个标志奉告idltojava同时为根和干生成代码.idltojava会生成一个Java包,它在IDL模块、RemoteTime以及生成的Java文件置入RemoteTime子目录后命名._ExactTimeImplBase.java代表我们用于实现服务器对象的“干”;而_ExactTimeStub.java将用于客户.在ExactTime.java中,用Java方法表示了IDL接口.此外还包含了用到的其他支持文件,比方用于简化拜候命名服务的文件.

3. 实现服务器和客户
大家在下面看到的是服务器端利用的代码.服务器对象是在ExactTimeServer类里实现的.RemoteTimeServer这个利用的作用是:成立一个服务器对象,通过ORB为其注册,指定对象引用时采取的名称,然后“安静”地等候客户发出恳求.
import RemoteTime.*;

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

import java.util.*;
import java.text.*;

// Server object implementation
class ExactTimeServer extends _ExactTimeImplBase{
  public String getTime(){
    return DateFormat.
        getTimeInstance(DateFormat.FULL).
          format(new Date(
              System.currentTimeMillis()));
  }
}

// Remote application implementation
public class RemoteTimeServer {
  public static void main(String args[])  {
    try {
      // ORB creation and initialization:
      ORB orb = ORB.init(args, null);
      // Create the server object and register it:
      ExactTimeServer timeServerObjRef = 
        new ExactTimeServer();
      orb.connect(timeServerObjRef);
      // Get the root naming context:
      org.omg.CORBA.Object objRef = 
        orb.resolve_initial_references(
          "NameService");
      NamingContext ncRef = 
        NamingContextHelper.narrow(objRef);
      // Assign a string name to the 
      // object reference (binding):
      NameComponent nc = 
        new NameComponent("ExactTime", "");
      NameComponent path[] = {nc};
      ncRef.rebind(path, timeServerObjRef);
      // Wait for client requests:
      java.lang.Object sync =
        new java.lang.Object();
      synchronized(sync){
        sync.wait();
      }
    }
    catch (Exception e)  {
      System.out.println(
         "Remote Time server error: " + e);
      e.printStackTrace(System.out);
    }
  }
}

正如大家看到的那样,服务器对象的实现是非常简单的;它是一个普通的Java类,从IDL编译器生成的“干”代码中担当而来.但在与ORB以及其他CORBA服务举行接洽的时刻,情形却变得略微有些复杂.

4. 一些CORBA服务
这里要简单介绍一下JavaIDL相关代码所做的工作(注意暂时忽视了CORBA代码与差别厂商有关这一事实).main()的第一行代码用于启动ORB.并且理所当然,这恰是服务器对象需求同它举行沟通的缘由.就在ORB初始化今后,紧接着就成立了一个服务器对象.实际上,它正式名称应当是“短时间服务对象”:从客户那边接纳恳求,“生存时间”与成立它的进程是相同的.成立好短时间服务对象后,就会通过ORB对其举行注册.这意味着ORB已知道它的存在,可将恳求转发给它.
到目前为止,我们拥有的全部东西就是一个timeServerObjRef——只有在当前服务器进程里才有效的一个对象引用.下一步是为这个服务对象分配一个字串情势的名字.客户会按照那个名字探求服务对象.我们通过命名服务(Naming Service)完成这一操作.首先,我们需求对命名服务的一个对象引用.通过调用resolve_initial_references(),可得到对命名服务的字串式对象引用(在JavaIDL中是“NameService”),并将这个引用返回.这是对采取narrow()办法的一个特定NamingContext引用的模子.我们目前可开始利用命名服务了.
为了将服务对象同一个字串情势的对象引用绑定在一同,我们首先成立一个NameComponent对象,用“ExactTime”举行初始化.“ExactTime”是我们想用于绑定服务对象的名称字串.随后利用rebind()办法,这是受限于对象引用的字串化引用.我们用rebind()分配一个引用——即便它已经存在.而假如引用已经存在,那么bind()会造成一个非常.在CORBA中,名称由一系列NameContext构成——这就是我们为什么要用一个数组将名称与对象引用绑定起来的缘由.
服务对象最好预备好由客户利用.此时,服务器进程会进入一种等候状况.一样地,由于它是一种“短时间服务”,所以生存时间要受服务器进程的限制.JavaIDL目前还没有供应对“长期对象”(只要成立它们的进程保持运行状况,对象就会一向存在下去)的支持.
目前,我们已对服务器代码的工作有了一定的熟习.接下来看看客户代码:
import RemoteTime.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;

public class RemoteTimeClient {
  public static void main(String args[]) {
    try {
      // ORB creation and initialization:
      ORB orb = ORB.init(args, null);
      // Get the root naming context:
      org.omg.CORBA.Object objRef = 
        orb.resolve_initial_references(
          "NameService");
      NamingContext ncRef = 
        NamingContextHelper.narrow(objRef);
      // Get (resolve) the stringified object 
      // reference for the time server:
      NameComponent nc = 
        new NameComponent("ExactTime", "");
      NameComponent path[] = {nc};
      ExactTime timeObjRef = 
        ExactTimeHelper.narrow(
          ncRef.resolve(path));
      // Make requests to the server object:
      String exactTime = timeObjRef.getTime();
      System.out.println(exactTime);
    } catch (Exception e) {
      System.out.println(
         "Remote Time server error: " + e);
      e.printStackTrace(System.out);
    }
  }
}

前几行所做的工作与它们在服务器进程里是一样的:ORB得到初始化,并解析出对命名服务的一个引用.
接下来,我们需求用到服务对象的一个对象引用,所以将字串情势的对象引用直接传送给resolve()办法,并用narrow()办法将后果造型到ExactTime接口引用里.最后调用getTime().

5. 激活名称服务进程
目前,我们已辨别得到了一个服务器和一个客户利用,它们已作好彼此间举行沟通的预备.大家知道二者都需求操纵命名服务绑定和解析字串情势的对象引用.在运行服务大概客户之前,我们必须启动命名服务进程.在JavaIDL中,命名服务属于一个Java利用,是随产品配套供应的.但它大概与其他产品有所差别.JavaIDL命名服务在JVM的一个实例里运行,并(默许)监督网络端口900.

6. 激活服务器与客户
目前,我们已预备好启动服务器和客户利用(之所以按这一次序,是由于服务器的存在是“短时间”的).若各个方面都设置无误,那么得到的就是在客户掌握台窗口内的一行输出文字,提醒我们当前的时间是多少.当然,这一后果本身并没有什么令人高兴的.但应注意一个问题:即便都处在同一台机械上,客户和服务器利用仍旧运行于差别的虚拟机内.它们之间的通信是通过一个基本的集成层举行的——即ORB与命名服务的集成.
这只是一个简单的例子,面向非网络环境计划.但普通将ORB配置成“与位置无关”.若服务器与客户辨别位于差别的机械上,那么ORB可用一个名为“安装库”(Implementation Repository)的组件解析出远程字串式引用.固然“安装库”属于CORBA的一部份,但它几近没有具体的规格,所以各厂商的实现方法是不尽相同的.
正如大家看到的那样,CORBA还有很多方面的问题未在这儿举行具体报告.但通过以上的介绍,应已对其有一个基本的熟习.若想得到CORBA更具体的资料,最传真的起点莫过于OMB Web站点,地址是http://www.omg.org.这个地方供应了丰富的文档资料、白页、程序以及对其他CORBA资源和产品的链接.
  以上是“一个例子(CORBA)[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>一个例子</b>
  • 一个例子(CORBA)
  • 自画标题栏的一个例子
  • 用python写windows code inject的一个例子
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .