JAVA与CORBA通信接口开发

corba(公用对象请求代理体系)是基于对象技术的分布计算应用软件体系结构。corba标准主要分为三个部分:接口定义语言(idl),对象请求代理(orb),以及orb之间的互操作协议iiop,核心是对象请求代理。corba与平台和语言无关。

java idl既是corba的一个实现,它是jdk1.3或更高版本的核心软件开发包之一,定义在org.omg.corba及其子包中,在java idl的支持下,开发开发人员可以使用如下两种开发方法 将java和corba集成在一起:

创建java对象并使之可在corba orb中展开;创建java类并作为http://www.makaidong.com/jinzhengquan/admin/editposts.aspx?catid=295786和其它orb一起展开的corba对象的客户,这种开发方法 提供了另外一种途径,通过它java可以被用于将你的新的应用开发和以前遗留的系统开发相集成。

采用java创建corba应用开发,corba对象服务的实现方式分为两种:对象的命名引用方式和字符串化对象引用方式,创建corba应用开发程序的开发过程 大体如下:编写idl接口定义文件;将接口定义文件编译为相应高级语言源代码,产生服务器开发框架与客户端存根;基于服务器开发框架,编写服务对象实现程序;基于客户端存根,编写客户对象调用程序;分别编译客户对象和服务对象程序;运行服务对象和客户对象程序。

第一步下载jacorb并配置jacorb

1,解压jacorb-2.3.0-bin,将jacorb拷贝到c:\jacorb;

2,修改c:\jacorb\bin下的文件,去掉idl.tpl,idl.bat.tpl,jaco.tpl和jaco.bat.tpl文件的后缀名".tpl";

3,在jacorb目录下建立classes文件夹,将etc中的jacorb_properties.template文件拷贝到classes下,将文件中(*)orbinitref.nameservice=file:/c:/ns_ref修改为
(*)jacorb.naming.ior_filename=c:/ns_ref,并将文件名改为jacorb.properties

4,在dos下输入ns即可。

但是在运行期间会出现 org.omg.corba.transient: retries exceeded, couldn't reconnect to 127.0.0.1:900  vmcid: 0x0  minor code: 0  completed: no” 

所以改用明命令

 tnameserv -orbinitialport 30000

源代码中用指定参数初始化 orb 的代码形如:

                   properties props = system.getproperties();

                   props.setproperty("org.omg.corba.orbclass""org.jacorb.orb.orb");

                   props.setproperty("org.omg.corba.orbsingletonclass""org.jacorb.orb.orbsingleton");

                   // 启动命名服务需要的参数 

                   props.setproperty("orbinitref.nameservice""corbaloc::192.168.0.5:30000/nameservice"); 

              // 初始化orb 

              org.omg.corba.orb orb = org.omg.corba.orb.init(args, props);

第二步下载orbstudio

解压缩从orbstudio/plugins/下面取得 orbstudio_7.7.7.jar 的jar包 放到eclipse/plugins下面,果考入jar包前以前eclipse是运行的请关闭,重新运行。

windows/preferences/出现如下窗口选择orb studio/idl compiler/ 在右边选择jacorb 这里有5种编译器我们使用jacorb. 打开idl compiler 前面的加号选择,

jacorb 右边参数idl command: d:\java\jacorb\bin\idl.bat

 command options: -d %d% %f% 这样就配置成功了eclipse下面的corba开发

第三步,编写idl文件

hello.idl

module helloapp
{
  interface hello
  {
     string sayhello(in string message);
  };
};

右键orb-->compile,会产生编译的源代码

_hellostub.java:该类是客户机stub,可为客户机提供corba功能,它实现hello.java接口。

也可以在idl文件所在的目录中使用命令:

 idlj -oldimplbase -fall hello.idl

编译该hello.idl文件。

hello.java:该接口含有idl接口的java版本,hello.java接口扩展org.omg.corba.object并提供标准的corba对象功能。

hellohelper.java:这是一个终态类,可以提供辅助功能,特别是提供将corba对象引用转换为适当类型所需的narrow()开发方法

helloholder.java:这是一个终态类,其中含有helo类型的公有实例成员,它可为“out”和“inout”变量提供操作,corba有这些变量,但不容易映射为java的语义。

hellooperations.java:这是一个接口类,其中含有开发方法 sayhello()。

helloimplbase.java:该抽象类是一个服务器开发skeleton,它可为服务器开发提供基本的corba功能,它实现hello.java接口,服务器开发类helloservant扩展helloimplbase。

要完成该应用开发程序,只需在文件helloserver.java和helloclient.java中提供服务器开发和客户机的实现即可。

、启动eclipse,新建java项目,一切默认即可,新建文件 
new->others->corba wizard->idl files->next->设置idl文件

此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com

路径及文件名称(此处以默认值为例)->finish 
打开simple.idl,将看到已经有了默认内容 
(大致意思是定义了一个模块,此模块对应到java里面就是一个 package,此模块(包)中定义了一个名为 myservice 的 interface,此interface定义了一个名为operation1的 开发方法  ,此 开发方法  还接收一个string类型的传入参数,大致就是这么个意 思,至于idm的协议规范,参见具体文档)

8、生成corba框架代码,右键simple.idl文件,orb menu->compile, 
此时会在src目录生成一个myserver的包,此包里面将会生成 
_myservicestub.java 
myservice.java 
myservicehelper.java 
myserviceholder.java 
myserviceoperations.java 
myservicepoa.java 
myservicepoatie.java 
这几个文件,至于具体各是什么意义,我也理太清楚,只知道 
myservice变是idl文件中定义的接口文件,后面 会经常用于与org.omg.corba.object打交道 
myservicehelper应该是个服务类,后面会经常用到,应该是 将对象的org.omg.corba.object、interface(myservice)之间进行包装转换用 
myserviceholder 看代码,觉得是个载体对象,具体如何用,目前还不太清楚 
myserviceoperations字面上看就是定义接口的操作的类,实际 是个接口,myservice就是继承自它(严格的说是接口继承,因为myservice也是接口) 
myservicepoa corba需要的类,我们实现接口(myservice)的类应该从它继承 
myservicepoatie就不太清楚其用处了

9、利用orb插件为生成实现接口的类,新建文件 
new->other->corba wizard->server->active object map->next-> 
idl fieldname:选择/{项目名称}/simple.idl 
interface: 选择myserver.myservice 
package:填写包名称(可以任意名称) 
server classname:myserviceserverimpl(可以任意取名) 
继续next,勾选 create server class(勾了会自动生成server端的默认代码,代码的内容形貌,取决于6的idl compiler选项值及具体的子command和command options)

10、打开 myserviceserverimpl,实现myserviceoperations接口定义的开发方法

11、编写服务端代码,打开 server_aom文件,默认代码是使用ior文件进行通信的,为了体现corab的跨平台开发特性,此处使用命名服务的方式运行, 
注释掉 try{...}里面的代码,编写如下代码,其它代码保持不变,并

import org.omg.cosnaming.*; 

修改后的代码

            // 启动命名服务需要的参数 
            props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); 

            // 初始化orb 
            org.omg.corba.orb orb = org.omg.corba.orb.init(args, props); 
            // 获取根poa引用 
            poa poaroot = poahelper.narrow(orb.resolve_initial_references("rootpoa")); 
            // 激活poa管理器 
            poaroot.the_poamanager().activate(); 
            // 实例化一个myserviceserverimpl对象 
            myserviceserverimpl serviceimpl = new myserviceserverimpl(); 
            // 从servant获得一个对象引用 
            org.omg.corba.object refobj = poaroot.servant_to_reference(serviceimpl); 
            // 获得对象接口引用 
            myserver.myservice service = myserver.myservicehelper.narrow(refobj); 
            // 命名上下文 
            org.omg.corba.object ncobj = orb.resolve_initial_references("nameservice"); 
            namingcontextext nc = namingcontextexthelper.narrow(ncobj); 
            // 绑定一个服务引用,以便客户端可以调用 
            nc.rebind(nc.to_name("simple.myservice"), service); 

            system.out.println("myservice is running and waiting......"); 
            // 运行orb 
            orb.run(); 

有必要说一下自己对corba启动整体流程的理解, 
首先是设置参数,

设置orb的服务端实现类

props.setproperty("org.omg.corba.orbclass", "org.jacorb.orb.orb"); 

调协orb的单例类

props.setproperty("org.omg.corba.orbsingletonclass", "org.jacorb.orb.orbsingleton"); 

设置orb命名服务的初始化参数,具体意思 corbaloc 协议名称 192.168.0.14 orb服务器开发地址(也可以是主机名) 30000 orb运行的端口

props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); 

设置了参数后,根据参数初始化一个org.omg.corba.orb的实例 
接着从orb实例中获取一个根

此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com

poa 对象引用 ,通过调用poahelper服务 开发方法  将poa根引用转换成poa对象, 
紧接着调用poa管理器,将其激活 
服务器开发 端环境设置完成,

进而创建实现接口的对象的实例, 
调用要根poa将其转换成一个org.omg.corba.object对象, 
再调用服务开发方法 得到其接口定义对象

通过orb对象获得一个命名服务器开发对象, 
通过命名服务辅助类得到一个命名上下文 
再通过命名上下文实与服务接口绑定(因为服务接口与实现接口的对象的已建立关系,所以此时命名上下文也与接口的实现对象建立了关系) 
绑定完成之后,就可以进行orb实例对象了

至此,服务端的运行完毕,只等待客户端的调用了。

12、编写客户端代码,还是通过orb 控件生成客户端代码,新建文件 
new->other->corba wizard->client->simple implementation,与9是基本一样,选择idl文件,选择接口文件、填写包名称、客户端类名称

13、打开myserviceclientimpl,找到initorb开发方法 ,注释默认添加的代码, 
其代码如下:

        properties props = system.getproperties(); 
       props.setproperty("org.omg.corba.orbclass", "org.jacorb.orb.orb"); 
       props.setproperty("org.omg.corba.orbsingletonclass", "org.jacorb.orb.orbsingleton"); 

        // 启动参数 
        props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); 

       orb = org.omg.corba.orb.init(args, props); 
       // 获得命名服务上下文 
        // 获得命名服务对象        
        org.omg.corba.object nsobj = null; 
        try { 
            nsobj = orb.resolve_initial_references("nameservice"); 
        } catch (invalidname e) { 
            // todo auto-generated catch block 
            e.printstacktrace(); 
        } 
        // 通过命名服务对象得到命名服务上下文 
        namingcontextext nc = namingcontextexthelper.narrow(nsobj); 
        // 从命名服务上下文中获得特定的命名服务对象 
        org.omg.corba.object svrobj = null; 
        try { 
            svrobj = nc.resolve_str("simple.myservice"); 
        } catch (notfound e) { 
            // todo auto-generated catch block 
            e.printstacktrace(); 
        } catch (cannotproceed e) { 
            // todo auto-generated catch block 
            e.printstacktrace(); 
        } catch (org.omg.cosnaming.namingcontextpackage.invalidname e) { 
            // todo auto-generated catch block 
            e.printstacktrace(); 
        } 
        // 从将特定命名服务对象中获得服务接口 
        myserver.myservice service = myservicehelper.narrow(svrobj); 
        target =  service;


客户端代码就比较简单了,简单描述一下, 
首先还是设置参数,初始化orb, 
从orb实例对象中获取命名服务对象, 
通过命名服务对象辅助类从命名服务对象中获取命名服务上下文对象, 
从命名服务上下文对象中获取指定名称的服务的org.omg.corba.object对象, 
再通过接口服务对象辅助类从org.omg.corba.object类型的接口服务对象中获取实现该接口服务的实例对象
获取了接口服务对象后,就可以使用该服务了,至于是谁实现了该接口,如何实现的,这里根本不关心,尽管使用就是了:)...

另外还需要修改main开发方法 ,取消默认的注释,这样才能调用服务接口定义的开发方法 !

对于这个客户端文件,在原有已导入命名空间的基础上还得导入如下一些

import org.omg.corba.orbpackage.invalidname;
import org.omg.cosnaming.namingcontextpackage.cannotproceed;
import org.omg.cosnaming.namingcontextpackage.notfound;
import myserver.myservicehelper;

14、说了代码层面的,就该启动服务了, 
首先启动corba,

运行->cmd->ns d:/java/jacorb/ctest/ns_ref -p 30000 

再运行server, 
右键 server_aop->run as->java application 
发现了什么,一大堆的红色的错误信息, 
大致如下:

org.omg.corba.initialize: can't instantiate default orb implementation org.jacorb.orb.orb  vmcid: 0x0  minor code: 0  completed: no 
    at org.omg.corba.orb.create_impl(unknown source) 
    at org.omg.corba.orb.init(unknown source) 
    at server_aom.main(server_aom.java:36) 
caused by: java.lang.classnotfoundexception: org.jacorb.orb.orb 
    at java.net.urlclassloader$1.run(unknown source) 
    at java.security.accesscontroller.doprivileged(native method) 
    at java.net.urlclassloader.findclass(unknown source) 
    at java.lang.classloader.loadclass(unknown source) 
    at sun.misc.launcher$appclassloader.loadclass(unknown source) 
    at java.lang.classloader.loadclass(unknown source) 
    at java.lang.classloader.loadclassinternal(unknown source) 
    at java.lang.class.forname0(native method) 
    at java.lang.class.forname(unknown source) 
    ... 3 more 

一看大致是没有找到org.jacorb.orb.orb这个类引起的问题,应该是没有引用相关的类引起的,

于是,项目->properties->java build path->libraries->add library->user library->next->user libraries->new->填写用户类库名称->选中刚新建的名称->add jars->浏览选择 d:\java\jacorb\lib\jacorb.jar (注意:此处的d:\java\jacorb视个人环境而定) 
再次运行,可恶,又一在段红色错误提示信息,在此也列出来吧,

org.omg.corba.initialize: can't instantiate default orb implementation org.jacorb.orb.orb  vmcid: 0x0  minor code: 0  completed: no 
    at org.omg.corba.orb.create_impl(unknown source) 
    at org.omg.corba.orb.init(unknown source) 
    at server_aom.main(server_aom.java:36) 
caused by: java.lang.noclassdeffounderror: org/apache/log/format/formatter 
    at java.lang.class.getdeclaredconstructors0(native method) 
    at java.lang.class.privategetdeclaredconstructors(unknown source) 
    at java.lang.class.getconstructor0(unknown source) 
    at java.lang.class.newinstance0(unknown source) 
    at java.lang.class.newinstance(unknown source) 
    at org.jacorb.util.environment.initlogging(unknown source) 
    at org.jacorb.util.environment.init(unknown source) 
    at org.jacorb.util.environment.<clinit>(unknown source) 
    at org.jacorb.orb.buffermanager.<clinit>(unknown source) 
    at org.jacorb.orb.orb.<init>(unknown source) 
    at sun.reflect.nativeconstructoraccessorimpl.newinstance0(native method) 
    at sun.reflect.nativeconstructoraccessorimpl.newinstance(unknown source) 
    at sun.reflect.delegatingconstructoraccessorimpl.newinstance(unknown source) 
    at java.lang.reflect.constructor.newinstance(unknown source) 
    at java.lang.class.newinstance0(unknown source) 
    at java.lang.class.newinstance(unknown source) 
    ... 3 more 

看 caused by: java.lang.noclassdeffounderror: org/apache/log/format/formatter 这 句,估计以是没有找到相关的引用类,于是,添加 d:\java\jacorb\lib\logkit-1.2.jar 到用户类库,具体开发方法 见上,

再次运行,还错误,

org.omg.corba.initialize: can't instantiate default orb implementation org.jacorb.orb.orb  vmcid: 0x0  minor code: 0  completed: no 
    at org.omg.corba.orb.create_impl(unknown source) 
    at org.omg.corba.orb.init(unknown source) 
    at server_aom.main(server_aom.java:36) 
caused by: java.lang.noclassdeffounderror: org/apache/avalon/framework/logger/logger 
    at java.lang.class.getdeclaredconstructors0(native method) 
    at java.lang.class.privategetdeclaredconstructors(unknown source) 
    at java.lang.class.getconstructor0(unknown source) 
    at java.lang.class.newinstance0(unknown source) 
    at java.lang.class.newinstance(unknown source) 
    at org.jacorb.util.environment.initlogging(unknown source) 
    at org.jacorb.util.environment.init(unknown source) 
    at org.jacorb.util.environment.<clinit>(unknown source) 
    at org.jacorb.orb.buffermanager.<clinit>(unknown source) 
    at org.jacorb.orb.orb.<init>(unknown source) 
    at sun.reflect.nativeconstructoraccessorimpl.newinstance0(native method) 
    at sun.reflect.nativeconstructoraccessorimpl.newinstance(unknown source) 
    at sun.reflect.delegatingconstructoraccessorimpl.newinstance(unknown source) 
    at java.lang.reflect.constructor.newinstance(unknown source) 
    at java.lang.class.newinstance0(unknown source) 
    at java.lang.class.newinstance(unknown source) 
    ... 3 more 


看 caused by: java.lang.noclassdeffounderror: org/apache/avalon/framework/logger/logger 这名,估计还是缺少相关的引用类,于是, 添加 d:\java\jacorb\lib\avalon-framework-4.1.5.jar 到用户类库,具体开发方法 见上,

再次运行,终于不是红色的提示信息了,而是等待已久的 
myservice is running and waiting......

终于成功了!

接下来,就是client运行了, 
右键myserviceclientimpl->run as->java application 
ok, 又输出一条信息 
a message in the bottle...

此时,console窗口里面应该只有两条件信息,如 
myservice is running and waiting...... 
a message in the bottle...

终于,这个java下的corrb应用开发就算完成了!

最后总结下corba应用开发的大体上的开发过程 吧: 
corba的配置、初始化参数就不说了,仅说说它如何应用开发的, 
首先定义服务接口 iservice , 
然后实现该接口 serviceimpl, 
创建实现该接口对象的实例 implinstance, 
通过orb得到一个与该实例相关联的org.omg.corba.object对象 implinstanceorbobj , 
通过 iservicehelper 从 implinstanceorbobj 中获取 iservice 类型的 对象 service , 
通过命名服务上下文,将其绑定到 接口服务对象 service , 同时提供一个服务名称,以便客户端定位到特定的服务, 
绑定完毕,就可以运行orb了,此时server就处于运行状态(监听客户端的调用),只等待客户端调用,至此,服务端程序运行完毕!

说了这么多,感觉还是不如直接帖代码来的实在,下面就帖出主要文件全部代码

server_aom.java

import java.io.file;
import java.io.fileoutputstream;
import java.io.printwriter;
import java.util.properties;

import org.omg.cosnaming.namingcontextext;
import org.omg.cosnaming.namingcontextexthelper;
import org.omg.portableserver.idassignmentpolicyvalue;
import org.omg.portableserver.lifespanpolicyvalue;
import org.omg.portableserver.poa;
import org.omg.portableserver.*;

public class server_aom {

	public static void main(string[] args) {

		properties props = system.getproperties();
		props.setproperty("org.omg.corba.orbclass", "org.jacorb.orb.orb");
		props.setproperty("org.omg.corba.orbsingletonclass", "org.jacorb.orb.orbsingleton");

		try {
//			// initialize the orb.
//			org.omg.corba.orb orb = org.omg.corba.orb.init(args, props);
//
//			// get a reference to the root poa
//			org.omg.corba.object obj = orb.resolve_initial_references("rootpoa");
//			poa poaroot = poahelper.narrow(obj);
//
//			// create policies for our persistent poa
//			org.omg.corba.policy[] policies = {
//					poaroot.create_lifespan_policy(lifespanpolicyvalue.persistent),
//					poaroot.create_id_assignment_policy(idassignmentpolicyvalue.user_id),
//					poaroot.create_thread_policy(threadpolicyvalue.orb_ctrl_model) 
//			};
//
//			// create mypoa with the right policies
//			poa poa = poaroot.create_poa("myserviceserverimpl_poa",	poaroot.the_poamanager(), policies);
//
//			// create the servant
//			myserviceserverimpl servant = new myserviceserverimpl();
//
//			// activate the servant with the id on mypoa
//			byte[] objectid = "anyobjectid".getbytes();
//			poa.activate_object_with_id(objectid, servant);
//			
//			// activate the poa manager
//			poaroot.the_poamanager().activate();
//
//			// get a reference to the servant and write it down.
//			obj = poa.servant_to_reference(servant);
//
//			// ---- uncomment below to enable naming service access. ----
//			// org.omg.corba.object ncobj = orb.resolve_initial_references("nameservice");
//			// namingcontextext nc = namingcontextexthelper.narrow(ncobj);
//			// nc.bind(nc.to_name("myserverobject"), obj);
//
//			printwriter ps = new printwriter(new fileoutputstream(new file("server.ior")));
//			ps.println(orb.object_to_string(obj));
//			ps.close();
//
//			system.out.println("corba server ready...");
//
//			// wait for incoming requests
//			orb.run();
			
            // 启动命名服务需要的参数 
            props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); 

            // 初始化orb 
            org.omg.corba.orb orb = org.omg.corba.orb.init(args, props); 
            // 获取根poa引用 
            poa poaroot = poahelper.narrow(orb.resolve_initial_references("rootpoa")); 
            // 激活poa管理器 
            poaroot.the_poamanager().activate(); 
            // 实例化一个myserviceserverimpl对象 
            myserviceserverimpl serviceimpl = new myserviceserverimpl(); 
            // 从servant获得一个对象引用 
            org.omg.corba.object refobj = poaroot.servant_to_reference(serviceimpl); 
            // 获得对象接口引用 
            myserver.myservice service = myserver.myservicehelper.narrow(refobj); 
            // 命名上下文 
            org.omg.corba.object ncobj = orb.resolve_initial_references("nameservice"); 
            namingcontextext nc = namingcontextexthelper.narrow(ncobj); 
            // 绑定一个服务引用,以便客户端可以调用 
            nc.rebind(nc.to_name("simple.myservice"), service); 

            system.out.println("myservice is running and waiting......"); 
            // 运行orb 
            orb.run(); 
		}
		catch(exception ex) {
			ex.printstacktrace();
		}
	}
}

myserviceclientimpl.java

/*
 * the client implementation is generated by the orb studio.
 */
import java.io.filereader;
import java.io.ioexception;
import java.io.linenumberreader;
import java.util.properties;

import org.omg.cosnaming.*;
import org.omg.corba.orbpackage.invalidname;
import org.omg.cosnaming.namingcontextpackage.cannotproceed;
import org.omg.cosnaming.namingcontextpackage.notfound;
import myserver.myservicehelper;

class myserviceclientimpl {
	private myserver.myservice target = null;
	private org.omg.corba.orb orb = null;

	/**
	 * constructor for myserviceclientimpl
	 * 
	 * @throws ioexception
	 */
	public myserviceclientimpl() throws ioexception {
		initorb(null);
	}

	/**
	 * constructor for myserviceclientimpl
	 * 
	 * @throws ioexception
	 * @see java.lang.object#object()
	 */
	public myserviceclientimpl(string[] args) throws ioexception {
		initorb(args);
	}

	/**
	 * initialize orb.
	 *  
	 * @param args
	 * @throws ioexception
	 */
	public void initorb(string[] args) throws ioexception {

		properties props = system.getproperties();
		props.setproperty("org.omg.corba.orbclass", "org.jacorb.orb.orb");
		props.setproperty("org.omg.corba.orbsingletonclass", "org.jacorb.orb.orbsingleton");

//		// initialize the orb
//		orb = org.omg.corba.orb.init((string[])args, props);
//
//		// ---- uncomment below to enable naming service access. ----
//		// org.omg.corba.object ncobj = orb.resolve_initial_references("nameservice");
//		// namingcontextext nc = namingcontextexthelper.narrow(ncobj);
//		// org.omg.corba.object obj = nc.resolve_str("myserverobject");
//
//		linenumberreader input = new linenumberreader(new filereader("server.ior"));
//		string ior = input.readline();
//		org.omg.corba.object obj = orb.string_to_object(ior);
//
//		target = myserver.myservicehelper.narrow(obj);		        
		
		// 启动参数 
        props.setproperty("orbinitref.nameservice", "corbaloc::192.168.0.14:30000/nameservice"); 

        orb = org.omg.corba.orb.init(args, props); 
        // 获得命名服务上下文 
         // 获得命名服务对象        
         org.omg.corba.object nsobj = null; 
         try { 
             nsobj = orb.resolve_initial_references("nameservice"); 
         } catch (invalidname e) { 
             // todo auto-generated catch block 
             e.printstacktrace(); 
         } 
         
         // 通过命名服务对象得到命名服务上下文 
         namingcontextext nc = namingcontextexthelper.narrow(nsobj); 
         // 从命名服务上下文中获得特定的命名服务对象 
         org.omg.corba.object svrobj = null; 
         try { 
             svrobj = nc.resolve_str("simple.myservice"); 
         } catch (notfound e) { 
             // todo auto-generated catch block 
             e.printstacktrace(); 
         } catch (cannotproceed e) { 
             // todo auto-generated catch block 
             e.printstacktrace(); 
         } catch (org.omg.cosnaming.namingcontextpackage.invalidname e) { 
             // todo auto-generated catch block 
             e.printstacktrace(); 
         } 
         // 从将特定命名服务对象中获得服务接口 
         myserver.myservice service = myservicehelper.narrow(svrobj); 
         target =  service;
	}

	/**
	 * obtain orb interface.
	 * 
	 * @return
	 */
	public myserver.myservice getorbinterface() {
		return target;
	}

	/**
	 * shutdown orb.
	 */
	public void shutdown() {
		orb.shutdown(true);
	}

	/**
	 * test driver for myserviceclientimpl.
	 * 
	 * @param args
	 */
	public static void main(string[] args) {
		try {
			myserviceclientimpl test = new myserviceclientimpl();
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JAVA开发人员必备是HTML格式的 JavaTM 2 Platform Standard Edition 6 API 规范 本文档是 Java 2 Platform Standard Edition 6.0 的 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的各类事件的接口和类。 java.awt.font 提供与字体相关的类和接口java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发接口java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口java.awt.print 为通用的打印 API 提供类和接口java.beans 包含与开发 beans 有关的类,即基于 JavaBeansTM 架构的组件。 java.beans.beancontext 提供与 bean 上下文有关的类和接口java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java 编程语言注释设施提供库支持。 java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类和接口,以获得关于类和对象的反射信息。 java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者类。 java.rmi 提供 RMI 包。 java.rmi.activation 为 RMI 对象激活提供支持。 java.rmi.dgc 为 RMI 分布式垃圾回收提供了类和接口java.rmi.registry 提供 RMI 注册表的一个类和两个接口java.rmi.server 提供支持服务器端 RMI 的类和接口java.security 为安全框架提供类和接口java.security.acl 此包中的类和接口已经被 java.security 包中的类取代。 java.security.cert 提供用于解析和管理证书、证书撤消列表 (CRL) 和证书路径的类和接口java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 Adleman AsymmetricCipher 算法)密钥,以及 NIST 的 FIPS-186 中定义的 DSA(数字签名算法)密钥。 java.security.spec 提供密钥规范和算法参数规范的类和接口java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口java.text.spi java.text 包中类的服务提供者类。 java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。 java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口java.util.prefs 此包允许应用程序存储并获取用户和系统首选项和配置数据。 java.util.regex 用于匹配字符序列与正则表达式指定模式的类。 java.util.spi java.util 包中类的服务提供者类。 java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。 javax.accessibility 定义了用户界面组件与提供对这些组件进行访问的辅助技术之间的协定。 javax.crypto 为加密操作提供类和接口javax.crypto.interfaces 根据 RSA Laboratories' PKCS #3 的定义,提供 Diffie-Hellman 密钥接口javax.crypto.spec 为密钥规范和算法参数规范提供类和接口javax.imageio Java Image I/O API 的主要包。 javax.imageio.event Java Image I/O API 的一个包,用于在读取和写入图像期间处理事件的同步通知。 javax.imageio.metadata 用于处理读写元数据的 Java Image I/O API 的包。 javax.imageio.plugins.bmp 包含供内置 BMP 插件使用的公共类的包。 javax.imageio.plugins.jpeg 支持内置 JPEG 插件的类。 javax.imageio.spi 包含用于 reader、writer、transcoder 和流的插件接口以及一个运行时注册表的 Java Image I/O API 包。 javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/O。 javax.management 提供 Java Management Extensions 的核心类。 javax.management.loading 提供实现高级动态加载的类。 javax.management.modelmbean 提供了 ModelMBean 类的定义。 javax.management.monitor 提供 monitor 类的定义。 javax.management.openmbean 提供开放数据类型和 Open MBean 描述符类。 javax.management.relation 提供 Relation Service 的定义。 javax.management.remote 对 JMX MBean 服务器进行远程访问使用的接口javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax.naming 为访问命名服务提供类和接口javax.naming.directory 扩展 javax.naming 包以提供访问目录服务的功能。 javax.naming.event 在访问命名和目录服务时提供对事件通知的支持。 javax.naming.ldap 提供对 LDAPv3 扩展操作和控件的支持。 javax.naming.spi 提供一些方法来动态地插入对通过 javax.naming 和相关包访问命名和目录服务的支持。 javax.net 提供用于网络应用程序的类。 javax.net.ssl 提供用于安全套接字包的类。 javax.print 为 JavaTM Print Service API 提供了主要类和接口javax.print.attribute 提供了描述 JavaTM Print Service 属性的类型以及如何分类这些属性的类和接口javax.print.attribute.standard 包 javax.print.attribute.standard 包括特定打印属性的类。 javax.print.event 包 javax.print.event 包含事件类和侦听器接口javax.rmi 包含 RMI-IIOP 的用户 API。 javax.rmi.CORBA 包含用于 RMI-IIOP 的可移植性 API。 javax.rmi.ssl 通过安全套接字层 (SSL) 或传输层安全 (TLS) 协议提供 RMIClientSocketFactory 和 RMIServerSocketFactory 的实现。 javax.security.auth 此包提供用于进行验证和授权的框架。 javax.security.auth.callback 此包提供与应用程序进行交互所必需的类,以便检索信息(例如,包括用户名和密码的验证数据)或显示信息(例如,错误和警告消息)。 javax.security.auth.kerberos 此包包含与 Kerberos 网络验证协议相关的实用工具类。 javax.security.auth.login 此包提供可插入的验证框架。 javax.security.auth.spi 此包提供用于实现可插入验证模块的接口javax.security.auth.x500 此包包含应该用来在 Subject 中存储 X500 Principal 和 X500 Private Crendentials 的类。 javax.security.cert 为公钥证书提供类。 javax.security.sasl 包含用于支持 SASL 的类和接口javax.sound.midi 提供用于 MIDI(音乐乐器数字接口)数据的 I/O、序列化和合成的接口和类。 javax.sound.midi.spi 在提供新的 MIDI 设备、MIDI 文件 reader 和 writer、或音库 reader 时提供服务提供者要实现的接口javax.sound.sampled 提供用于捕获、处理和回放取样的音频数据的接口和类。 javax.sound.sampled.spi 在提供新音频设备、声音文件 reader 和 writer,或音频格式转换器时,提供将为其创建子类的服务提供者的抽象类。 javax.sql 为通过 JavaTM 编程语言进行服务器端数据源访问和处理提供 API。 javax.sql.rowset JDBC RowSet 实现的标准接口和基类。 javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing.border 提供围绕 Swing 组件绘制特殊边框的类和接口javax.swing.colorchooser 包含供 JColorChooser 组件使用的类和接口javax.swing.event 供 Swing 组件触发的事件使用。 javax.swing.filechooser 包含 JFileChooser 组件使用的类和接口javax.swing.plaf 提供一个接口和许多抽象类,Swing 用它们来提供自己的可插入外观功能。 javax.swing.plaf.basic 提供了根据基本外观构建的用户界面对象。 javax.swing.plaf.metal 提供根据 Java 外观(曾经代称为 Metal)构建的用户界面对象,Java 外观是默认外观。 javax.swing.plaf.multi 提供了组合两个或多个外观的用户界面对象。 javax.swing.plaf.synth Synth 是一个可更换皮肤 (skinnable) 的外观,在其中可委托所有绘制。 javax.swing.table 提供用于处理 javax.swing.JTable 的类和接口javax.swing.text 提供类 HTMLEditorKit 和创建 HTML 文本编辑器的支持类。 javax.swing.text.html 提供类 HTMLEditorKit 和创建 HTML 文本编辑器的支持类。 javax.swing.text.html.parser 提供默认的 HTML 解析器以及支持类。 javax.swing.text.rtf 提供一个类 (RTFEditorKit),用于创建富文本格式(Rich-Text-Format)的文本编辑器。 javax.swing.tree 提供处理 javax.swing.JTree 的类和接口javax.swing.undo 允许开发人员为应用程序(例如文本编辑器)中的撤消/恢复提供支持。 javax.transaction 包含解组期间通过 ORB 机制抛出的三个异常。 javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 javax.xml.bind 为包含解组、编组和验证功能的客户端应用程序提供运行时绑定框架。 javax.xml.bind.annotation 定义将 Java 程序元素定制成 XML 模式映射的注释。 javax.xml.bind.annotation.adapters XmlAdapter 及其规范定义的子类允许任意 Java 类与 JAXB 一起使用。 javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的已优化的二进制数据。 javax.xml.bind.helpers 仅由 JAXB 提供者用于: 提供某些 javax.xml.bind 接口的部分默认实现。 javax.xml.bind.util 有用的客户端实用工具类。 javax.xml.crypto 用于 XML 加密的通用类。 javax.xml.crypto.dom javax.xml.crypto 包的特定于 DOM 的类。 javax.xml.crypto.dsig 用于生成和验证 XML 数字签名的类。 javax.xml.crypto.dsig.dom javax.xml.crypto.dsig 包特定于 DOM 的类。 javax.xml.crypto.dsig.keyinfo 用来解析和处理 KeyInfo 元素和结构的类。 javax.xml.crypto.dsig.spec XML 数字签名的参数类。 javax.xml.datatype XML/Java 类型映射关系。 javax.xml.namespace XML 名称空间处理。 javax.xml.parsers 提供允许处理 XML 文档的类。 javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream.util javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 javax.xml.transform.dom 此包实现特定于 DOM 的转换 API。 javax.xml.transform.sax 此包实现特定于 SAX2 的转换 API。 javax.xml.transform.stax 提供特定于 StAX 的转换 API。 javax.xml.transform.stream 此包实现特定于流和 URI 的转换 API。 javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含核心 JAX-WS API。 javax.xml.ws.handler 该包定义用于消息处理程序的 API。 javax.xml.ws.handler.soap 该包定义用于 SOAP 消息处理程序的 API。 javax.xml.ws.http 该包定义特定于 HTTP 绑定的 API。 javax.xml.ws.soap 该包定义特定于 SOAP 绑定的 API。 javax.xml.ws.spi 该包定义用于 JAX-WS 2.0 的 SPI。 javax.xml.xpath 此包提供了用于 XPath 表达式的计算和访问计算环境的 object-model neutral API。 org.ietf.jgss 此包提供一个框架,该框架允许应用程序开发人员通过利用统一的 API 使用一些来自各种基础安全机制(如 Kerberos)的安全服务,如验证、数据完整性和和数据机密性。 org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 Java[tm] Standard Edition 6 中现有 CORBA 接口所进行的添加。 org.omg.CORBA_2_3.portable 提供输入和输出值类型的各种方法,并包含 org/omg/CORBA/portable 包的其他更新。 org.omg.CORBA.DynAnyPackage 提供与 DynAny 接口一起使用的异常(InvalidValue、Invalid、InvalidSeq 和 TypeMismatch)。 org.omg.CORBA.ORBPackage 提供由 ORB.resolve_initial_references 方法抛出的异常 InvalidName,以及由 ORB 类中的动态 Any 创建方法抛出的异常 InconsistentTypeCode。 org.omg.CORBA.portable 提供可移植性层,即可以使一个供应商生成的代码运行在另一个供应商 ORB 上的 ORB API 集合。 org.omg.CORBA.TypeCodePackage 提供用户定义的异常 BadKind 和 Bounds,它们将由 TypeCode 类中的方法抛出。 org.omg.CosNaming 为 Java IDL 提供命名服务。 org.omg.CosNaming.NamingContextExtPackage 此包包含以下在 org.omg.CosNaming.NamingContextExt 中使用的类: AddressHelper StringNameHelper URLStringHelper InvalidAddress 包规范 有关 Java[tm] Platform, Standard Edition 6 ORB 遵守的官方规范的受支持部分的明确列表,请参阅 Official Specifications for CORBA support in Java[tm] SE 6。 org.omg.CosNaming.NamingContextPackage 此包包含 org.omg.CosNaming 包的 Exception 类。 org.omg.Dynamic 此包包含 OMG Portable Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?ptc/2000-08-06 的第 21.9 小节中指定的 Dynamic 模块。 org.omg.DynamicAny 提供一些类和接口使得在运行时能够遍历与 any 有关联的数据值,并提取数据值的基本成分。 org.omg.DynamicAny.DynAnyFactoryPackage 此包包含 DynamicAny 模块的 DynAnyFactory 接口中的类和异常,该模块在 OMG The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的第 9.2.2 小节中指定。 org.omg.DynamicAny.DynAnyPackage 此包包含 DynAny 模块的 DynAnyFactory 接口中的类和异常,该模块在 OMG The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的第 9.2 小节中指定。 org.omg.IOP 此包包含在 OMG 文档 The Common Object Request Broker: Architecture and Specification http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 的 13.6.小节中指定的 IOP 模块。 org.omg.IOP.CodecFactoryPackage 此包包含 IOP::CodeFactory 接口中指定的异常(作为 Portable Interceptor 规范的一部分)。 org.omg.IOP.CodecPackage 此包根据 IOP::Codec IDL 接口定义生成。 org.omg.Messaging 此包包含 OMG Messaging Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?formal/99-10-07 中指定的 Messaging 模块。 org.omg.PortableInterceptor 提供一个注册 ORB 钩子 (hook) 的机制,通过这些钩子 ORB 服务可以截取执行 ORB 的正常流。 org.omg.PortableInterceptor.ORBInitInfoPackage 此包包含 OMG Portable Interceptor 规范 http://cgi.omg.org/cgi-bin/doc?ptc/2000-08-06 的第 21.7.2 小节中指定的 PortableInterceptor 模块的 ORBInitInfo 本地接口中的异常和 typedef。 org.omg.PortableServer 提供一些类和接口,用来生成跨多个供应商 ORB 的可移植应用程序的服务器端。 org.omg.PortableServer.CurrentPackage 提供各种方法实现,这些实现能够访问调用方法的对象的身份。 org.omg.PortableServer.POAManagerPackage 封装 POA 关联的处理状态。 org.omg.PortableServer.POAPackage 允许程序员构造可在不同 ORB 产品间移植的对象实现。 org.omg.PortableServer.portable 提供一些类和接口,用来生成跨多个供应商 ORB 的可移植应用程序的服务器端。 org.omg.PortableServer.ServantLocatorPackage 提供定位 servant 的类和接口。 org.omg.SendingContext 为值类型的编组提供支持。 org.omg.stub.java.rmi 包含用于 java.rmi 包中出现的 Remote 类型的 RMI-IIOP Stub。 org.w3c.dom 为文档对象模型 (DOM) 提供接口,该模型是 Java API for XML Processing 的组件 API。 org.w3c.dom.bootstrap org.w3c.dom.events org.w3c.dom.ls org.xml.sax 此包提供了核心 SAX API。 org.xml.sax.ext 此包包含适合的 SAX 驱动程序不一定支持的 SAX2 设施的接口。 org.xml.sax.helpers 此包包含“帮助器”类,其中包括对引导基于 SAX 的应用程序的支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值