《第六章编写客户端程序知识讲解》由会员分享,可在线阅读,更多相关《第六章编写客户端程序知识讲解(54页珍藏版)》请在金锄头文库上搜索。
1、第六章 编写客户端程序,第六章 编写客户端程序,基本知识 DII DSI 接口库 上下文,基本知识,Request接口,定义了对一个CORBA对象的某一操作的一次调用请求 调用一个操作之前必须首先获取目标对象引用 见P140,调用类型,静态调用:客户程序在编译前就知道IDL接口信息 动态调用: 编写客户程序时尚未确定IDL接口类型 运行时利用接口库服务提供的信息创建一个请求对象 大部分任务是建立请求对象,而不是调用过程本身,选择调用类型,简单性 DII需由程序员手工完成IDL桩所完成的任务 灵活性 调用性能 通信方式 SII支持同步,单向 DII支持三种:同步,单向,延迟同步 小结:能用SII
2、则用SII,编写客户程序静态,public class Client public static void main(String args) org.omg.CORBA.ORB orb=org.omg.CORBA.ORB.init(args, null); / 利用POA全称与对象标识BankManager查找帐户管理员 Bank.AccountManager manager = Bank.AccountManagerHelper.bind( orb, /BankPOA, BankManager.getBytes(); String name = args.length 0 ? args0
3、: David Zeng; / 请求帐户管理员找出一个指定名字的帐户,无此帐户则新开一个 Bank.Account account = manager.open(name); System.out.println(name + “的帐户余额为” + account.getBalance() + 元); account.deposit(200); System.out.println(“存款200元后,余额为” + account.getBalance() + “元”); if (account.withdraw(600) System.out.println(“取款600元后,余额为” + a
4、ccount.getBalance() + 元); else System.out.println(余额不足600元,取款失败,余额保持不变); ,客户程序Client.java,public class Client() public static void main(String args) org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null); org.omg.CORBA.Object manager = (com.inprise.vbroker.orb.ORB) orb).bind( “BankPOA”,”BankManag
5、er”.getBytes(),null,null); org.omg.CORBA.Request requestOpen = manager._request(“open”); String name = args.length0?args0:”David”;. requestOpen.add_in_arg().insert_string(name); requestOpen.set_return_type(orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_objeref); requsetOpen.invoke(); org.omg.CORBA.Obj
6、ect account = requestOpen.result().value().extract_Object(); org.omg.CORBA.Request requestBalance = account._request(“getBalance”); requestBalance.set_return_type(orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_float); requestBalance.invoke(); float bal=requestBalance.resutl().value().extract_float();
7、System.out.println(“帐户”+name+”的余额为”+bal); ,初始化org,获取帐户管理员的通用对象引用,创建一个调用manager的open()操作的请求对象,设置请求的实际参数,设置请求的返回结果的类型,以同步通信方式发送请求,提取返回结果,继续以DII方式调用account 的getBalance()方法,编写客户程序动态,2 动态调用机制,动态调用机制,基本接口 动态调用过程 编程,基本接口,动态调用接口,CORBA:Object:定义每个CORBA对象都必须支持的方法 CORBA: ORB:定义客户端和服务端都能使用的操作,是内核实现的方法 CORBA: Re
8、quest:定义远程对象操作 CORBA: List:用于构建参数列表,维护一个由构造类型NameValue组成的数据项列表,伪对象,IDL对象类由IDL语言描述并需要向BOA和ORB核心登记和管理,而且IDL对 象类都继承基类CORBAObject 伪对象类尽管也可以由IDL语言描述,但是,它不需要向 BOA和ORB核心登记,也不需要继承CORBAObject类。 伪对象类包括Environment、NameVal ue、NVList、Request、ServerRequest、Context、Princial、TypeCode、BOA和ORB。,CORBA:ORB,见P141 Create
9、_list:生成一个空的NVlist对象 Create_operation_list:生成NVlist对象,利用客户描述的操作参数自动进行填充,并将已赋值的NVlist返回给客户,CORBA:Object(对象引用),创建一个请求,在目标对象上执行 _request: 创建一个请求对象后,可调用该请求对象的add_in_arg(),add_name_in_arg()等方法为调用操作设置一个或多个实参 _create_request:调用前必须先创建操作的实参,CORBA:Request(操作请求),Add_arg:在请求格式中添加参数 Invoke:完成一个调用/返回操作 Send:根据请求中
10、的信息发起操作,不需等待操作结果就将控制返回给调用者 Pull_reponse:检查请求操作是否完成 Get_reponse:回送执行请求的结果信息,NVList(参数与返回值),用于构造参数列表的接口 Add_item:把一个新的参数加到指定的列表中 Free_memory:,动态调用过程,一:查询接口定义信息 1 客户调用目标对象中的get_interface操作。调用后,客户得到一个存放在接口库中的InterfaceDef对象,从而获得目标对象的接口描述信息,二:寻找操作的描述 2 以InteraceDef对象作为接口库导航的入口点,找出有关的接口对象以及它所支持的操作。(通过调用Int
11、erfaceDef的lookup_name操作,得到OperationDef对象) 3 调用OperationDef对象中的describe(),获得需调用的操作的完整描述,即操作的全部IDL定义,三. 准备参数列表 4 调用ORB接口中用于动态调用的create_list方法,创建一个空闲的参数列表,即Nvlist对象 5 调用Nvlist上的add_item(),将各个请求参数逐一填入参数列表中,四。创建请求对象 6 调用目标对象上的,从CORBA:Object接口继承的create_request操作,构造一个请求对象。在请求中指出操作名,参数和返回结果参数,五。调用已建立的请求 7 调
12、用ORB:Request对象中的invoke操作,发起对请求的调用 六 善后 8 执行ORB:Request对象的delete操作,释放请求对象和相关的内存空间 9 调用ORB:NVlist对象上free操作,释放列表结构的相关空间,public class Client() public static void main(String args) org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null); org.omg.CORBA.Object manager = (com.inprise.vbroker.orb.ORB) orb)
13、.bind( “BankPOA”,”BankManager”.getBytes(),null,null); org.omg.CORBA.Request requestOpen = manager._request(“open”); String name = args.length0?args0:”David”;. requestOpen.add_in_arg().insert_string(name); requestOpen.set_return_type(orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_objeref); requsetOpen.
14、invoke(); org.omg.CORBA.Object account = requestOpen.result().value().extract_Object(); org.omg.CORBA.Request requestBalance = account._request(“getBalance”); requestBalance.set_return_type(orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_float); requestBalance.invoke(); float bal=requestBalance.resutl(
15、).value().extract_float(); System.out.println(“帐户”+name+”的余额为”+bal); ,初始化org,获取帐户管理员的通用对象引用,创建一个调用manager的open()操作的请求对象,设置请求的实际参数,设置请求的返回结果的类型,以同步通信方式发送请求,提取返回结果,继续以DII方式调用account 的getBalance()方法,实例,客户端DII编程,实现规范,客户可以使用DII对任意多个接口的对象发起调用 对一个接口的一部分对象发起调用,另一部分用静态存根调用 可对一个接口的一个对象有时使用DII,有时使用静态存根 用一组API获
16、得和解析一个调用,实现并返回结果,编写DII,获取目标对象引用 创建请求对象 传递实际参数并指定返回类型 发送请求并等待响应 提取结果,步骤,向目标对象询问描述目标对象接口信息的对象,并将其放在接口库中 从接口库的对象中,找到所要调用的操作的描述 建立调用参数表,并逐一填入参数 创建请求。请求中包含目标对象的引用,方法名,参数表和返回值 调用请求,并作善后处理,1 获取目标对象引用,因为编译客户程序时目标对象的接口类型通常尚未确定,因而没有可用帮助类 扩展两个bind()方法,public org.omg.CORBA.Object bind( String fullPoaName,/POA全名 byte objectId,/对象标识 String hostName,/对象所在主机名字 BindOptions options/绑定选项 ) public org.om