CORBA 客户端/服务端的处理流程(Java示例)

sweetbaybe

贡献于2012-03-05

字数:3040 关键词: Java开发 Java

CORBA 客户端/服务端的处理流程(Java示例) 一、客户端的处理流程 ORB的初始化   --> 分布式对象引用的获取  --> 分布式对象的引用    | 1、ORB(Object Request Broker,对象请求代理)是基于CORBA的分布式对象系统的核心,在代理对象(Stub)和分布式对象实现的背后,由ORB提供了实现分布式对象系统所需要的各种服务。由ORB提供的服务包括如下四种:     1)ORB接口。主要包括 ORB的初始化(获取ORB)、获取CORBA服务对象、动态调用请求的生成、分布式对象引用的变换等。     2)DII(动态启动接口)。将客户端生成的对象调用请求传送给ORB时需要利用DII。     3)DSI(动态骨架接口)。DSI是与DII对应的服务器端的接口,分布式对象实现利用该接口从ORB中获取来自客户端的请求。     4)OA(对象适配器)。它是用于在服务器进程中管理分布式对象而提供的接口。OA提供的主要的功能包括分布式对象引用的生成,以及将分布式对象实现登录到ORB中等。      在客户端中,ORB的初始化有以下两个目的     1)为分布式对象初始化环境     2)为了利用ORB接口而获取其对象的引用 2、分布式对象引用的获取     一般来说,CORBA系统不同,获取分布式对象引用的方法也不同,目前大概有如下几种方法:       1)利用文件的方法获取对象。过程是:服务器将所生成的分布式对象引用进行字符串化处理后保存在文件中,并以某种方式将其发送到客户端能够获取的设备上。客户端从该文件中获取字符串的分布式对象引用,并将其恢复原状。     分布式对象引用的字符串化:                 ORB orb = ORB.init();                 String orbstr = orb.object_to_string((Object)con_ref);                 //将orbstr 以文件形式发送给客户端      字符串化引用的复原:                 BankControl ank_ref;                 ank_ref = Bank.ControlHelper.narrow(orb.string_to_object(orbstr));                 ...       2)利用Binding 服务的方法获取对象引用。Binging 服务,包括:定位(locating)、连接(binding)。定位服务通常利用服务器端的 IP 地址和端口进行定位。为了对连接进行管理以及进行调用请求的传递,在这一出理过程的最后阶段要生成与此接口对应的Stub类的对象,即代理对象。这一处理过程一般是利用IDL接口定义经映射之后所生成的Helper类中的narrow() 方法完成。       3)利用命名服务的方法获取对象引用。现在的ORB产品供应商都提供CORBA命名服务。如果从可移植性和互操作性等反面考虑,CORBA命名都是最优秀的。        4)利用factory对象的方法获取对象引用。 3、分布式对象的引用。CORBA客户利用代理对象来调用分布式对象中的方法。在Java环境下,代理对象是作为Java类来实现的,即Stub类。在客户端与分布式对象进行连接操作时,是通过利用所生成的Stub类的对象来进行的。由于这一对像起到代理作用,固称之为代理对象。 示例代码: //创建一个ORB实例,并初始ORB ORB orb = ORB.init(args, null); //获取根名称上下文 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");   NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); //从命名上下文中获取接口实现对象 String name = "Hello"; helloImpl = HelloHelper.narrow(ncRef.resolve_str(name)); //调用接口对象的方法   System.out.println(helloImpl.sayHello()); //关闭分布式对象 helloImpl.shutdown(); 二、服务器端的处理流程 ORB的初始化 --> BOA/POA的初始化  --> 分布式对象的生成  --> 分布式对象的登录  --> 接收请求开始      |   1、ORB功能中的服务器所需要的功能都组织到OA(对象适配器)中来。OA所提供的功能仅在服务器端使用,这些功能包括:       1)分布式对象引用的生成       2)分布式对象的登录与删除       3)服务器进程的登录与删除       4)分布式对象的激活       5)服务器进程的激活       6)方法调用请求的发送(dispatch)       7)方法启动请求的认证信息的抽取 2、BOA(Basic Object Adapter,基本对象适配器),提供了由对象适配器所必须提供的最基本的功能。在CORBA 2.2版本中,BOA被删除掉,取而代之的是POA(Portable Object Adapter,可移植的对象适配器)。 3、分布式对象实现是指实现分布式对象功能的代码,对Java映射来说,一般用一个类来实现。分布式对象实现中必须实现的功能:       1)由IDL接口所定义的方法。       2)由org.omg.CORBA.Object接口所定义的分布式对象的语义。这就跟Java中的普通对象要实现java.lang.Object一样。       3)保存分布式对象的ID以及连接管理等信息的方法。       4)将来自客户端的请求发送给相应的分布式方法的功能。     分布式对象的实现方法有两种:一种是利用Skeleton类,即静态实现方法;另一种是利用DSI,即动态实现方法。 4、分布式对象的登录。分布式对象生成后并不能直接执行任务,因为对于ORB来说,它还不认识这个对象。为了是ORB能管理分布式对象,就需要将“已经生成新对象并处于接受请求的状态”这一信息通知ORB,这一通知的处理过程就叫分布式对象的登录。 5、接收请求   示例代码: //创建一个ORB实例,并初始化ORb ORB orb = ORB.init(args, null); //得到一个RootPOA的引用,并激活POAManager POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate();   //创建一个HelloImpl分布式对象,并注册到ORB上 HelloImpl helloImpl = new HelloImpl(); helloImpl.setORB(orb); //分布式对象的登录 org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref); //得到一个根名称的上下文 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); //在命名上下文中绑定这个对象 String name = "Hello"; NameComponent path[] = ncRef.to_name(name); ncRef.rebind(path, href); System.out.println("HelloServer ready and waiting ..."); //启动线程服务,等待客户端的调用 orb.run();

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档