




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章编写客户端程序,第六章编写客户端程序,基本知识DIIDSI接口库上下文,基本知识,请求,请求:是一个CORBA伪对象,与一个请求对象相关联的信息包括目标对象引用,操作名字,0或多个参数,可选的上下文,以及用于存放返回结果或异常信息的环境封装一个请求有两种格式静态:请求对象由IDL桩隐式发送动态:显式创建一个请求对象,选择一种通信方式发送并获取响应结果,由接口Request描述,Request接口,定义了对一个CORBA对象的某一操作的一次调用请求调用一个操作之前必须首先获取目标对象引用见P140,调用类型,静态调用:客户程序在编译前就知道IDL接口信息动态调用:编写客户程序时尚未确定IDL接口类型运行时利用接口库服务提供的信息创建一个请求对象大部分任务是建立请求对象,而不是调用过程本身,选择调用类型,简单性DII需由程序员手工完成IDL桩所完成的任务灵活性调用性能通信方式SII支持同步,单向DII支持三种:同步,单向,延迟同步小结:能用SII则用SII,编写客户程序静态,publicclassClientpublicstaticvoidmain(Stringargs)org.omg.CORBA.ORBorb=org.omg.CORBA.ORB.init(args,null);/利用POA全称与对象标识BankManager查找帐户管理员Bank.AccountManagermanager=Bank.AccountManagerHelper.bind(orb,/BankPOA,BankManager.getBytes();Stringname=args.length0?args0:DavidZeng;/请求帐户管理员找出一个指定名字的帐户,无此帐户则新开一个Bank.Accountaccount=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元后,余额为”+account.getBalance()+元);elseSystem.out.println(余额不足600元,取款失败,余额保持不变);,客户程序Client.java,publicclassClient()publicstaticvoidmain(Stringargs)org.omg.CORBA.ORBorb=org.omg.CORBA.ORB.init(args,null);org.omg.CORBA.Objectmanager=(com.inprise.vbroker.orb.ORB)orb).bind(“BankPOA”,”BankManager”.getBytes(),null,null);org.omg.CORBA.RequestrequestOpen=manager._request(“open”);Stringname=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.Objectaccount=requestOpen.result().value().extract_Object();org.omg.CORBA.RequestrequestBalance=account._request(“getBalance”);requestBalance.set_return_type(orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_float);requestBalance.invoke();floatbal=requestBalance.resutl().value().extract_float();System.out.println(“帐户”+name+”的余额为”+bal);,初始化org,获取帐户管理员的通用对象引用,创建一个调用manager的open()操作的请求对象,设置请求的实际参数,设置请求的返回结果的类型,以同步通信方式发送请求,提取返回结果,继续以DII方式调用account的getBalance()方法,编写客户程序动态,2动态调用机制,动态调用机制,基本接口动态调用过程编程,基本接口,动态调用接口,CORBA:Object:定义每个CORBA对象都必须支持的方法CORBA:ORB:定义客户端和服务端都能使用的操作,是内核实现的方法CORBA:Request:定义远程对象操作CORBA:List:用于构建参数列表,维护一个由构造类型NameValue组成的数据项列表,伪对象,IDL对象类由IDL语言描述并需要向BOA和ORB核心登记和管理,而且IDL对象类都继承基类CORBAObject伪对象类尽管也可以由IDL语言描述,但是,它不需要向BOA和ORB核心登记,也不需要继承CORBAObject类。伪对象类包括Environment、NameValue、NVList、Request、ServerRequest、Context、Princial、TypeCode、BOA和ORB。,CORBA:ORB,见P141Create_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:根据请求中的信息发起操作,不需等待操作结果就将控制返回给调用者Pull_reponse:检查请求操作是否完成Get_reponse:回送执行请求的结果信息,NVList(参数与返回值),用于构造参数列表的接口Add_item:把一个新的参数加到指定的列表中Free_memory:,动态调用过程,一:查询接口定义信息1客户调用目标对象中的get_interface操作。调用后,客户得到一个存放在接口库中的InterfaceDef对象,从而获得目标对象的接口描述信息,二:寻找操作的描述2以InteraceDef对象作为接口库导航的入口点,找出有关的接口对象以及它所支持的操作。(通过调用InterfaceDef的lookup_name操作,得到OperationDef对象)3调用OperationDef对象中的describe(),获得需调用的操作的完整描述,即操作的全部IDL定义,三.准备参数列表4调用ORB接口中用于动态调用的create_list方法,创建一个空闲的参数列表,即Nvlist对象5调用Nvlist上的add_item(),将各个请求参数逐一填入参数列表中,四。创建请求对象6调用目标对象上的,从CORBA:Object接口继承的create_request操作,构造一个请求对象。在请求中指出操作名,参数和返回结果参数,五。调用已建立的请求7调用ORB:Request对象中的invoke操作,发起对请求的调用六善后8执行ORB:Request对象的delete操作,释放请求对象和相关的内存空间9调用ORB:NVlist对象上free操作,释放列表结构的相关空间,publicclassClient()publicstaticvoidmain(Stringargs)org.omg.CORBA.ORBorb=org.omg.CORBA.ORB.init(args,null);org.omg.CORBA.Objectmanager=(com.inprise.vbroker.orb.ORB)orb).bind(“BankPOA”,”BankManager”.getBytes(),null,null);org.omg.CORBA.RequestrequestOpen=manager._request(“open”);Stringname=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.Objectaccount=requestOpen.result().value().extract_Object();org.omg.CORBA.RequestrequestBalance=account._request(“getBalance”);requestBalance.set_return_type(orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_float);requestBalance.invoke();floatbal=requestBalance.resutl().value().extract_float();System.out.println(“帐户”+name+”的余额为”+bal);,初始化org,获取帐户管理员的通用对象引用,创建一个调用manager的open()操作的请求对象,设置请求的实际参数,设置请求的返回结果的类型,以同步通信方式发送请求,提取返回结果,继续以DII方式调用account的getBalance()方法,实例,客户端DII编程,实现规范,客户可以使用DII对任意多个接口的对象发起调用对一个接口的一部分对象发起调用,另一部分用静态存根调用可对一个接口的一个对象有时使用DII,有时使用静态存根用一组API获得和解析一个调用,实现并返回结果,编写DII,获取目标对象引用创建请求对象传递实际参数并指定返回类型发送请求并等待响应提取结果,步骤,向目标对象询问描述目标对象接口信息的对象,并将其放在接口库中从接口库的对象中,找到所要调用的操作的描述建立调用参数表,并逐一填入参数创建请求。请求中包含目标对象的引用,方法名,参数表和返回值调用请求,并作善后处理,1获取目标对象引用,因为编译客户程序时目标对象的接口类型通常尚未确定,因而没有可用帮助类扩展两个bind()方法,publicorg.omg.CORBA.Objectbind(StringfullPoaName,/POA全名byteobjectId,/对象标识StringhostName,/对象所在主机名字BindOptionsoptions/绑定选项)publicorg.omg.CORBA.Objectbind(StringrepositoryId,/接口库标识StringobjectName,/对象名StringhostName,/对象所在主机名字BindOptionsoptions/绑定选项)org.omg.CORBA.Objectmanager=(com.inprise.vbroker.orb.ORB)orb).bind(“BankPOA”,”BankManager”.getBytes(),null,null);,2创建请求对象,对目标对象引用的某一操作的一次调用发起请求时,请求对象被打包通过ORB发送到服务端使用SII时,该过程对程序员是透明的使用DII,必须由程序员自己显式创建并发送请求对象必须由程序员自己显式地创建并发送请求对象,_request()/_create_requestorg.omg.CORBA.Requestrequest=manager._request(“open”);,3传递实参并指定返回类型,请求对象中操作的实际参数表被表示为一个NVlist实例,是若干NamedValue对象的列表,每个NamedValue是一三元组(名字,值,标志),4发送请求和提取结果,invoke():阻塞,处理完返回send_deferred():非阻塞Return_value(),publicclassClient()publicstaticvoidmain(Stringargs)org.omg.CORBA.ORBorb=org.omg.CORBA.ORB.init(args,null);org.omg.CORBA.Objectmanager=(com.inprise.vbroker.orb.ORB)orb).bind(“BankPOA”,”BankManager”.getBytes(),null,null);org.omg.CORBA.RequestrequestOpen=manager._request(“open”);Stringname=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.Objectaccount=requestOpen.result().value().extract_Object();org.omg.CORBA.RequestrequestBalance=account._request(“getBalance”);requestBalance.set_return_type(orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_float);requestBalance.invoke();floatbal=requestBalance.resutl().value().extract_float();System.out.println(“帐户”+name+”的余额为”+bal);,初始化org,获取帐户管理员的通用对象引用,创建一个调用manager的open()操作的请求对象,设置请求的实际参数,设置请求的返回结果的类型,以同步通信方式发送请求,提取返回结果,继续以DII方式调用account的getBalance()方法,2.4实例,_Accountstub.javaDII,publicbooleanwithdraw(floatamount)org.omg.CORBA.Request_request=this._request(withdraw);_request.set_return_type(_orb().get_primitive_tc(org.omg.CORBA.TCKind.tk_boolean);org.omg.CORBA.Any_param_amount=_request.add_in_arg();_param_amount.insert_float(float)amount);_request.invoke();java.lang.Exception_exception=_request.env().exception();if(_exception!=null)throw(org.omg.CORBA.SystemException)_exception;boolean_result;_result=_request.return_value().extract_boolean();return_result;,_Accountstub.javaSII,publicbooleanwithdraw(floatamount)while(true)if(!_is_local()org.omg.CORBA.portable.OutputStream_output=null;org.omg.CORBA.portable.InputStream_input=null;boolean_result;try_output=this._request(withdraw,true);_output.write_float(float)amount);_input=this._invoke(_output);_result=_input.read_boolean();return_result;catch(org.omg.CORBA.portable.ApplicationException_exception)finalorg.omg.CORBA.portable.InputStreamin=_exception.getInputStream();java.lang.String_exception_id=_exception.getId();throwneworg.omg.CORBA.UNKNOWN(UnexpectedUserException:+_exception_id);catch(org.omg.CORBA.portable.RemarshalException_exception)continue;finallythis._releaseReply(_input);elsefinalorg.omg.CORBA.portable.ServantObject_so=_servant_preinvoke(withdraw,_opsClass);if(_so=null)continue;finalBank.AccountOperations_self=(Bank.AccountOperations)_so.servant;tryreturn_self.withdraw(amount);,DSI,动态框架,DSI允许server在运行时刻动态对任意对象予以实现可以实现任意多个接口的对象可以实现一个接口中的一部分对象,另一部分由静态框架实现不必继承由IDL编译器生成的框架(POA类),也不必使用纽带机制间接使用POA类,原理,POA,Impl,ServerRequest,ServerRequest,IR,开发步骤,利用回调方法invoke()接收从ORB转发来的一个ServerRequest类型的请求对象从请求对象中提取实际参数向上调用真正执行服务的伺服对象的方法将结果或异常填入请求对象中,1对象ServerRequest,ClassServerRequestpublic:constchar*operation()const;voidargument(NVList_prt作用:实现动态框架功能,arguments(inoutNVlistnv):得到输入型参数的值。准备:按照对应操作的IDL定义为NVlist进行初始赋值,包括设置每个元素的类型码和标志(flags,输入输出类型)执行后,NVlist得到输入型参数值完成功能后,在NVList中设置返回的值set_result():设置返回结果的值set_exception():抛出异常,2请求实现,DSI方式下,对象的请求交给动态实现例程DIR(DynamicImplementationRoutine)完成:接收请求,获得请求的操作信息,动态决定如何实现对象,最后返回结果DIR:不是某一特定接口的实现对象通过对象适配器获得一个请求,并进一步获得该请求的操作信息动态决定如何实现该对象通过对象适配器返回输出结果需要实现DIR的例程要由特定对象实现(实现DynamicImplementation接口),InterfaceDynamicImplementationvoidinvoke();,importorg.omg.CORBA.*;importorg.omg.PortableServer.*;publicclassBankImplextendsorg.omg.PortableServer.DynamicImplementation/属性的定义protectedjava.util.MapaccountList;/所有账户的列表protectedORBorb;/用于创建请求对象的ORB伪对象protectedPOApoa;/用于创建新对象引用的POApublicBankImpl(ORBorb,POApoa)accountList=newjava.util.HashMap();this.orb=orb;this.poa=poa;/ORB回调方法,是每一个采用DSI的对象实现都必须实现的方法,需要实现该接口,构造方法,管理员开始时管理的账户清单为空,3程序实例,publicvoidinvoke(ServerRequestrequest)/根据当前对象引用取对象标识(对Account而言,对象标识就是账户名字)StringobjectId=newString(_object_id();System.out.println(objectId+executing+request.operation()+().);/根据请求对象中的操作名字分别处理if(request.operation().equals(open)/开设账户操作tryorg.omg.CORBA.NVListparamList=orb.create_list(0);org.omg.CORBA.Anyparam=orb.create_any();param.insert_string();paramList.add_value(name,param,org.omg.CORBA.ARG_IN.value);request.arguments(paramList);Stringname=paramList.item(0).value().extract_string();/执行开户操作,在账户清单中查找或开设指定名字的账户if(accountList.get(name)=null)java.util.Randomrandom=newjava.util.Random();floatbalance=Math.abs(random.nextInt()%100000/100f;accountList.put(name,newFloat(balance);System.out.println(新开账户:+name);org.omg.CORBA.Objectaccount=poa.create_reference_with_id(name.getBytes(),IDL:Bank/Account:1.0);org.omg.CORBA.Anyresult=orb.create_any();result.insert_Object(account);request.set_result(result);catch(Exceptionexc)exc.printStackTrace();,从请求对象中获取实际参数,往请求对象中填写返回结果,创建一any型,并填入“”,elseif(request.operation().equals(deposit)/存款操作try/根据对象标识取账户余额Floatbalance=(Float)accountList.get(objectId);if(balance=null)throwneworg.omg.CORBA.BAD_PARAM();/从请求对象中获取参数org.omg.CORBA.NVListparamList=orb.create_list(0);org.omg.CORBA.Anyparam=orb.create_any();param.insert_float(0);paramList.add_value(amount,param,org.omg.CORBA.ARG_IN.value);request.arguments(paramList);floatamount=paramList.item(0).value().extract_float();/执行存款操作accountList.remove(objectId);accountList.put(objectId,newFloat(balance.floatValue()+amount);/该操作没有返回结果catch(Exceptionexc)exc.printStackTrace();,elseif(request.operation().equals(withdraw)/取款操作try/根据对象标识取账户余额Floatbalance=(Float)accountList.get(objectId);if(balance=null)throwneworg.omg.CORBA.BAD_PARAM();/从请求对象中获取参数org.omg.CORBA.NVListparamList=orb.create_list(0);org.omg.CORBA.Anyparam=orb.create_any();param.insert_float(0);paramList.add_value(amount,param,org.omg.CORBA.ARG_IN.value);request.arguments(paramList);floatamount=paramList.item(0).value().extract_float();/执行取款操作并填写请求对象中的返回结果org.omg.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第12课 增进民生福祉教学设计-2025-2026学年中职思想政治经济政治与社会(第4版)北师大版
- 冠心病的考试题及答案
- 公务礼仪上考试题及答案
- 工程类知识考试题及答案
- 高中挑战考试题及答案解析
- 2025海域集装箱运输合同
- 非负数中考试题及答案
- 2025媒介广告代理合同
- 精神病医院建设项目建筑工程方案
- 乡镇燃气一体化工程节能评估报告
- 手印鉴定书模板
- DB11T 065-2022 电气防火检测技术规范
- 人教版八年级历史上册第一次月考试题(附答案)第一单元
- 基本不等式课件-高三数学一轮复习
- DL∕T 2568-2022 电力行业数字化审计平台功能构件与技术要求
- 部编人教版《道德与法治》六年级上册第9课《知法守法 依法维权》精美课件(第1课时)
- 消防喷淋系统设计合同范本
- DB32-T 4757-2024 连栋塑料薄膜温室建造技术规范
- 2024年四川省广安市中考数学试题(含答案逐题解析)
- 山西省太原三十七中2023-2024学年九年级上学期月考物理试卷(10月份)
- (幻灯片)世界各国国旗大全中文
评论
0/150
提交评论