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

链接地址:https://www.31ppt.com/p-5641784.html