![第六章編寫客戶端程序ppt課件_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/2/b5120d45-9f4d-4d84-8d31-dff6373607b1/b5120d45-9f4d-4d84-8d31-dff6373607b11.gif)
![第六章編寫客戶端程序ppt課件_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/2/b5120d45-9f4d-4d84-8d31-dff6373607b1/b5120d45-9f4d-4d84-8d31-dff6373607b12.gif)
![第六章編寫客戶端程序ppt課件_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/2/b5120d45-9f4d-4d84-8d31-dff6373607b1/b5120d45-9f4d-4d84-8d31-dff6373607b13.gif)
![第六章編寫客戶端程序ppt課件_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/2/b5120d45-9f4d-4d84-8d31-dff6373607b1/b5120d45-9f4d-4d84-8d31-dff6373607b14.gif)
![第六章編寫客戶端程序ppt課件_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/2/b5120d45-9f4d-4d84-8d31-dff6373607b1/b5120d45-9f4d-4d84-8d31-dff6373607b15.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院基礎(chǔ)技術(shù)教學(xué)部第六章第六章 編寫客戶端程序編寫客戶端程序山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院第六章第六章 編寫客戶端程序編寫客戶端程序根本知識根本知識DIIDSI接口庫接口庫上下文上下文山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院基礎(chǔ)技術(shù)教學(xué)部根本知識根本知識山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院懇求懇求懇求:是一個懇求:是一個CORBA偽對象,與一個懇求對象相關(guān)偽對象,與一個懇求對象相關(guān)聯(lián)的信息包括目的對象援用,操作名字,聯(lián)的信息包括目的對象援用,操作名字,0或多個參或多個參數(shù),可選的上下文,以及用于存放前往結(jié)果或異常數(shù),可選的上下文,以及用于存放前往結(jié)果或異常信息的環(huán)境信息的環(huán)境封裝一個懇求有兩
2、種格式封裝一個懇求有兩種格式靜態(tài):懇求對象由靜態(tài):懇求對象由IDL樁隱式發(fā)送樁隱式發(fā)送動態(tài):顯式創(chuàng)建一個懇求對象,選擇一種通訊方式動態(tài):顯式創(chuàng)建一個懇求對象,選擇一種通訊方式發(fā)送并獲取呼應(yīng)結(jié)果,由接口發(fā)送并獲取呼應(yīng)結(jié)果,由接口Request描畫描畫山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院Request接口接口定義了對一個定義了對一個CORBA對象的某一操作的一次調(diào)用懇對象的某一操作的一次調(diào)用懇求求調(diào)用一個操作之前必需首先獲取目的對象援用調(diào)用一個操作之前必需首先獲取目的對象援用見見P140山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院調(diào)用類型調(diào)用類型靜態(tài)調(diào)用:客戶程序在編譯前就知道靜態(tài)調(diào)用:客戶程序在編譯前就知道IDL接口信
3、息接口信息動態(tài)調(diào)用:動態(tài)調(diào)用:編寫客戶程序時髦未確定編寫客戶程序時髦未確定IDL接口類型接口類型運轉(zhuǎn)時利用接口庫效力提供的信息創(chuàng)建一個懇求對運轉(zhuǎn)時利用接口庫效力提供的信息創(chuàng)建一個懇求對象象大部分義務(wù)是建立懇求對象,而不是調(diào)用過程本身大部分義務(wù)是建立懇求對象,而不是調(diào)用過程本身山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院選擇調(diào)用類型選擇調(diào)用類型簡單性簡單性DII需由程序員手工完成需由程序員手工完成IDL樁所完成的義務(wù)樁所完成的義務(wù)靈敏性靈敏性調(diào)用性能調(diào)用性能通訊方式通訊方式SII支持同步,單向支持同步,單向DII支持三種:同步,單向,延遲同步支持三種:同步,單向,延遲同步小結(jié):能用小結(jié):能用SII那么用那么用S
4、II山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院編寫客戶程序編寫客戶程序靜態(tài)靜態(tài)public class Client public static void main(String args) org.omg.CORBA.ORB orb=org.omg.CORBA.ORB.init(args, null); / 利用利用POA全稱與對象標(biāo)識全稱與對象標(biāo)識BankManager查找?guī)艄芾韱T查找?guī)艄芾韱T Bank.AccountManager manager = Bank.AccountManagerHelper.bind( orb, /BankPOA, BankManager.getBytes(); Str
5、ing name = args.length 0 ? args0 : David Zeng; / 懇求帳戶管理員找出一個指定名字的帳戶,無此帳戶那么新開一個懇求帳戶管理員找出一個指定名字的帳戶,無此帳戶那么新開一個 Bank.Account account = manager.open(name); System.out.println(name + “的帳戶余額為的帳戶余額為 + account.getBalance() + 元元); account.deposit(200); System.out.println(“存款存款200元后,余額為元后,余額為 + account.getBala
6、nce() + “元元); if (account.withdraw(600) System.out.println(“取款取款600元后,余額為元后,余額為 + account.getBalance() + 元元); else System.out.println(余額缺乏余額缺乏600元,取款失敗,余額堅持不變元,取款失敗,余額堅持不變); 客戶程序Client.java初始化初始化ORB綁定到效力對象綁定到效力對象調(diào)用效力對象提供的效力調(diào)用效力對象提供的效力山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院public class Client() public static void main(String
7、 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,BankManager.getBytes(),null,null); org.omg.CORBA.Request requestOpen = manager._request(“open); String name = args.length0?args0:David;. requestOpen.add_i
8、n_arg().insert_string(name); requestOpen.set_return_type(orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_objeref); requsetOpen.invoke(); org.omg.CORBA.Object account = requestOpen.result().value().extract_Object(); org.omg.CORBA.Request requestBalance = account._request(“getBalance); requestBalance.set
9、_return_type(orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_float); requestBalance.invoke(); float bal=requestBalance.resutl().value().extract_float(); System.out.println(“帳戶帳戶+name+的余額為的余額為+bal); 初始化org獲取帳戶管理員的通用對象援用創(chuàng)建一個調(diào)用manager的open()操作的懇求對象設(shè)置懇求的實踐參數(shù)設(shè)置懇求的前往結(jié)果的類型以同步通訊方式發(fā)送懇求提取前往結(jié)果繼續(xù)以DII方式調(diào)用account的ge
10、tBalance()方法編寫客戶程序編寫客戶程序動態(tài)動態(tài)山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院基礎(chǔ)技術(shù)教學(xué)部2 動態(tài)調(diào)用機(jī)制動態(tài)調(diào)用機(jī)制山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院動態(tài)調(diào)用機(jī)制動態(tài)調(diào)用機(jī)制根本接口根本接口動態(tài)調(diào)用過程動態(tài)調(diào)用過程編程編程山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院基礎(chǔ)技術(shù)教學(xué)部根本接口根本接口山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院動態(tài)調(diào)用接口動態(tài)調(diào)用接口CORBA:Object:定義每個:定義每個CORBA對象都必需支對象都必需支持的方法持的方法CORBA: ORB:定義客戶端和效力端都能運用的操:定義客戶端和效力端都能運用的操作,是內(nèi)核實現(xiàn)的方法作,是內(nèi)核實現(xiàn)的方法CORBA: Request:定義遠(yuǎn)程對象操作
11、:定義遠(yuǎn)程對象操作CORBA: List:用于構(gòu)建參數(shù)列表,維護(hù)一個由構(gòu):用于構(gòu)建參數(shù)列表,維護(hù)一個由構(gòu)造類型造類型NameValue組成的數(shù)據(jù)項列表組成的數(shù)據(jù)項列表山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院偽對象偽對象IDL對象類由對象類由IDL言語描畫并需求向言語描畫并需求向BOA和和ORB中中心登記和管理,而且心登記和管理,而且IDL對對 象類都承繼基類象類都承繼基類CORBAObject偽對象類雖然也可以由偽對象類雖然也可以由IDL言語描畫,但是,它不言語描畫,但是,它不需求向需求向 BOA和和ORB中心登記,也不需求承繼中心登記,也不需求承繼CORBAObject類。類。偽對象類包括偽對象類包括E
12、nvironment、NameVal ue、NVList、Request、ServerRequest、Context、Princial、TypeCode、BOA和和ORB。 山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院CORBA:ORB見見P141Create_list:生成一個空的:生成一個空的NVlist對象對象Create_operation_list:生成:生成NVlist對象,利用客戶對象,利用客戶描畫的操作參數(shù)自動進(jìn)展填充,并將已賦值的描畫的操作參數(shù)自動進(jìn)展填充,并將已賦值的NVlist前往給客戶前往給客戶山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院CORBA:Object對象援用對象援用創(chuàng)建一個懇求,在目的對象
13、上執(zhí)行創(chuàng)建一個懇求,在目的對象上執(zhí)行_request: 創(chuàng)建一個懇求對象后,可調(diào)用該懇求對象創(chuàng)建一個懇求對象后,可調(diào)用該懇求對象的的add_in_arg(),add_name_in_arg()等方法為調(diào)用操等方法為調(diào)用操作設(shè)置一個或多個實參作設(shè)置一個或多個實參_create_request:調(diào)用前必需先創(chuàng)建操作的實參:調(diào)用前必需先創(chuàng)建操作的實參山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院CORBA:Request操作懇求操作懇求Add_arg:在懇求格式中添加參數(shù):在懇求格式中添加參數(shù)Invoke:完成一個調(diào)用:完成一個調(diào)用/前往操作前往操作Send:根據(jù)懇求中的信息發(fā)起操作,不需等待操作:根據(jù)懇求中的信息發(fā)
14、起操作,不需等待操作結(jié)果就將控制前往給調(diào)用者結(jié)果就將控制前往給調(diào)用者Pull_reponse:檢查懇求操作能否完成:檢查懇求操作能否完成Get_reponse:回送執(zhí)行懇求的結(jié)果信息:回送執(zhí)行懇求的結(jié)果信息山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院NVList參數(shù)與前往值參數(shù)與前往值用于構(gòu)造參數(shù)列表的接口用于構(gòu)造參數(shù)列表的接口Add_item:把一個新的參數(shù)加到指定的列表中:把一個新的參數(shù)加到指定的列表中Free_memory:山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院基礎(chǔ)技術(shù)教學(xué)部動態(tài)調(diào)用過程動態(tài)調(diào)用過程山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院clienServer1 get_interface2 lookup_name3desc
15、ribe4 create_list5 add_item (1-n)6 create_request7 invoke8 delete9 freeInterfaceDefOperationDefCORBA:ORBCORBA:NvlistCORBA:ObjectORB:Request動態(tài)調(diào)用環(huán)境接口庫環(huán)境山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院一:查詢接口定義信息1 客戶調(diào)用目的對象中的get_interface操作。調(diào)用后,客戶得到一個存放在接口庫中的InterfaceDef對象,從而獲得目的對象的接口描畫信息山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院二:尋覓操作的描畫2 以InteraceDef對象作為接口庫導(dǎo)航的入口點
16、,找出有關(guān)的接口對象以及它所支持的操作。經(jīng)過調(diào)用InterfaceDef的lookup_name操作,得到OperationDef對象3 調(diào)用OperationDef對象中的describe(),獲得需調(diào)用的操作的完好描畫,即操作的全部IDL定義山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院三. 預(yù)備參數(shù)列表4 調(diào)用ORB接口中用于動態(tài)調(diào)用的create_list方法,創(chuàng)建一個空閑的參數(shù)列表,即Nvlist對象5 調(diào)用Nvlist上的add_item(),將各個懇求參數(shù)逐一填入?yún)?shù)列表中山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院四。創(chuàng)建懇求對象6 調(diào)用目的對象上的,從CORBA:Object接口承繼的create_reque
17、st操作,構(gòu)造一個懇求對象。在懇求中指出操作名,參數(shù)和前往結(jié)果參數(shù)山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院五。調(diào)用已建立的懇求7 調(diào)用ORB:Request對象中的invoke操作,發(fā)起對懇求的調(diào)用六 善后8 執(zhí)行ORB:Request對象的delete操作,釋放懇求對象和相關(guān)的內(nèi)存空間9 調(diào)用ORB:NVlist對象上free操作,釋放列表構(gòu)造的相關(guān)空間山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院public class Client() public static void main(String args) org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,nu
18、ll); org.omg.CORBA.Object manager = (com.inprise.vbroker.orb.ORB) orb).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.
19、get_primitive_tc(org.omg.CORBA.TCKind.tk_objeref); requsetOpen.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_flo
20、at); requestBalance.invoke(); float bal=requestBalance.resutl().value().extract_float(); System.out.println(“帳戶帳戶+name+的余額為的余額為+bal); 初始化org獲取帳戶管理員的通用對象援用創(chuàng)建一個調(diào)用manager的open()操作的懇求對象設(shè)置懇求的實踐參數(shù)設(shè)置懇求的前往結(jié)果的類型以同步通訊方式發(fā)送懇求提取前往結(jié)果繼續(xù)以DII方式調(diào)用account的getBalance()方法實例實例山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院基礎(chǔ)技術(shù)教學(xué)部客戶端客戶端DII編程編程山東大學(xué)計算機(jī)科學(xué)與技
21、術(shù)學(xué)院實現(xiàn)規(guī)范實現(xiàn)規(guī)范客戶可以運用客戶可以運用DII對恣意多個接口的對象發(fā)起調(diào)用對恣意多個接口的對象發(fā)起調(diào)用對一個接口的一部分對象發(fā)起調(diào)用,另一部分用靜對一個接口的一部分對象發(fā)起調(diào)用,另一部分用靜態(tài)存根調(diào)用態(tài)存根調(diào)用可對一個接口的一個對象有時運用可對一個接口的一個對象有時運用DII,有時運用靜,有時運用靜態(tài)存根態(tài)存根用一組用一組API獲得和解析一個調(diào)用,實現(xiàn)并前往結(jié)果獲得和解析一個調(diào)用,實現(xiàn)并前往結(jié)果山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院編寫編寫DII獲取目的對象援用獲取目的對象援用創(chuàng)建懇求對象創(chuàng)建懇求對象傳送實踐參數(shù)并指定前往類型傳送實踐參數(shù)并指定前往類型發(fā)送懇求并等待呼應(yīng)發(fā)送懇求并等待呼應(yīng)提取結(jié)果提
22、取結(jié)果山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院步驟步驟向目的對象訊問描畫目的對象接口信息的對象,并向目的對象訊問描畫目的對象接口信息的對象,并將其放在接口庫中將其放在接口庫中從接口庫的對象中,找到所要調(diào)用的操作的描畫從接口庫的對象中,找到所要調(diào)用的操作的描畫建立調(diào)用參數(shù)表,并逐一填入?yún)?shù)建立調(diào)用參數(shù)表,并逐一填入?yún)?shù)創(chuàng)建懇求。懇求中包含目的對象的援用,方法名,創(chuàng)建懇求。懇求中包含目的對象的援用,方法名,參數(shù)表和前往值參數(shù)表和前往值調(diào)用懇求,并作善后處置調(diào)用懇求,并作善后處置山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院1 獲取目的對象援用獲取目的對象援用由于編譯客戶程序時目的對象的接口類型通常尚未由于編譯客戶程序時目的對象
23、的接口類型通常尚未確定,因此沒有可用協(xié)助類確定,因此沒有可用協(xié)助類擴(kuò)展兩個擴(kuò)展兩個bind()方法方法public org.omg.CORBA.Object bind( String fullPoaName,/POA全名 byte objectId,/對象標(biāo)識 String hostName,/對象所在主機(jī)名字 BindOptions options/綁定選項)public org.omg.CORBA.Object bind( String repositoryId,/接口庫標(biāo)識 String objectName,/對象名 String hostName,/對象所在主機(jī)名字 BindOpti
24、ons options/綁定選項)org.omg.CORBA.Object manager = (com.inprise.vbroker.orb.ORB) orb).bind(“BankPOA,BankManager.getBytes(),null,null);山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院2 創(chuàng)建懇求對象創(chuàng)建懇求對象對目的對象援用的某一操作的一次調(diào)用對目的對象援用的某一操作的一次調(diào)用發(fā)起懇求時,懇求對象被打包經(jīng)過發(fā)起懇求時,懇求對象被打包經(jīng)過ORB發(fā)送到效力端發(fā)送到效力端運用運用SII時,該過程對程序員是透明的時,該過程對程序員是透明的運用運用DII,必需由程序員本人顯式創(chuàng)建并發(fā)送懇求對象,必
25、需由程序員本人顯式創(chuàng)建并發(fā)送懇求對象必需由程序員本人顯式地創(chuàng)建并發(fā)送懇求對象,必需由程序員本人顯式地創(chuàng)建并發(fā)送懇求對象,_request()/_create_requestorg.omg.CORBA.Request request = manager._request(“open);山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院3 傳送實參并指定前往類型傳送實參并指定前往類型懇求對象中操作的實踐參數(shù)表被表示為一個懇求對象中操作的實踐參數(shù)表被表示為一個NVlist實例,是假設(shè)干實例,是假設(shè)干NamedValue對象的列表,每個對象的列表,每個NamedValue是一三元組是一三元組(名字,值,標(biāo)志名字,值,標(biāo)志)
26、山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院4 發(fā)送懇求和提取結(jié)果發(fā)送懇求和提取結(jié)果invoke():阻塞,處置完前往:阻塞,處置完前往send_deferred():非阻塞:非阻塞Return_value()山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院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(
27、“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.invoke(); org
28、.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().value().extr
29、act_float(); System.out.println(“帳戶帳戶+name+的余額為的余額為+bal); 初始化org獲取帳戶管理員的通用對象援用創(chuàng)建一個調(diào)用manager的open()操作的懇求對象設(shè)置懇求的實踐參數(shù)設(shè)置懇求的前往結(jié)果的類型以同步通訊方式發(fā)送懇求提取前往結(jié)果繼續(xù)以DII方式調(diào)用account的getBalance()方法2.4 實例實例山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院_Accountstub.javaDII public boolean withdraw (float amount) org.omg.CORBA.Request _request = this._requ
30、est(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)
31、 throw (org.omg.CORBA.SystemException) _exception; boolean _result; _result = _request.return_value().extract_boolean(); return _result; 山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院_Accountstub.javaSII public boolean withdraw (float amount) while (true) if (!_is_local() org.omg.CORBA.portable.OutputStream _output = null; org.omg
32、.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) final org.omg.CO
33、RBA.portable.InputStream in = _exception.getInputStream(); java.lang.String _exception_id = _exception.getId(); throw new org.omg.CORBA.UNKNOWN(Unexpected User Exception: + _exception_id); catch (org.omg.CORBA.portable.RemarshalException _exception) continue; finally this._releaseReply(_input); else
34、 final org.omg.CORBA.portable.ServantObject _so = _servant_preinvoke(withdraw, _opsClass); if (_so = null) continue; final Bank.AccountOperations _self = (Bank.AccountOperations)_so.servant; try return _self.withdraw(amount); 山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院基礎(chǔ)技術(shù)教學(xué)部DSI山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院動態(tài)框架動態(tài)框架DSI允許允許server在運轉(zhuǎn)時辰動態(tài)對恣意對象予以實
35、現(xiàn)在運轉(zhuǎn)時辰動態(tài)對恣意對象予以實現(xiàn)可以實現(xiàn)恣意多個接口的對象可以實現(xiàn)恣意多個接口的對象可以實現(xiàn)一個接口中的一部分對象,另一部分由靜可以實現(xiàn)一個接口中的一部分對象,另一部分由靜態(tài)框架實現(xiàn)態(tài)框架實現(xiàn)不用承繼由不用承繼由IDL編譯器生成的框架編譯器生成的框架POA類,也類,也不用運用紐帶機(jī)制間接運用不用運用紐帶機(jī)制間接運用POA類類山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院原理原理POAImplServerRequestServerRequestIR山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院開發(fā)步驟開發(fā)步驟利用回調(diào)方法利用回調(diào)方法invoke()接納從接納從ORB轉(zhuǎn)發(fā)來的一個轉(zhuǎn)發(fā)來的一個ServerRequest類型的懇求對象
36、類型的懇求對象從懇求對象中提取實踐參數(shù)向上調(diào)用真正執(zhí)行效力從懇求對象中提取實踐參數(shù)向上調(diào)用真正執(zhí)行效力的伺服對象的方法的伺服對象的方法將結(jié)果或異常填入懇求對象中將結(jié)果或異常填入懇求對象中山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院1 對象對象ServerRequestClass ServerRequest public:const char * operation() const;void argument(NVList_prt& parmaters);Context_ptr ctx();void set_result(const Any& value);void set_exceptionc
37、onst Any& value;;作用:實現(xiàn)動態(tài)框架功能山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院arguments(inout NVlist nv): 得到輸入型參數(shù)的值。得到輸入型參數(shù)的值。預(yù)備:按照對應(yīng)操作的預(yù)備:按照對應(yīng)操作的IDL定義為定義為NVlist進(jìn)展初始賦值,包括設(shè)置每個元進(jìn)展初始賦值,包括設(shè)置每個元素的類型碼和標(biāo)志素的類型碼和標(biāo)志flags,輸入輸出類型,輸入輸出類型執(zhí)行后,執(zhí)行后,NVlist得到輸入型參數(shù)值得到輸入型參數(shù)值完勝利能后,在完勝利能后,在NVList中設(shè)置前往的值中設(shè)置前往的值set_result():設(shè)置前往結(jié)果的值:設(shè)置前往結(jié)果的值set_exception(
38、): 拋出異常拋出異常山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院2 懇務(wù)虛現(xiàn)懇務(wù)虛現(xiàn)DSI方式下,對象的懇求交給動態(tài)實現(xiàn)例程方式下,對象的懇求交給動態(tài)實現(xiàn)例程DIR(Dynamic Implementation Routine)完成:接納懇求,獲得懇求的操作信息,動態(tài)決議如何實現(xiàn)對完成:接納懇求,獲得懇求的操作信息,動態(tài)決議如何實現(xiàn)對象,最后前往結(jié)果象,最后前往結(jié)果DIR: 不是某一特定接口的實現(xiàn)對象不是某一特定接口的實現(xiàn)對象經(jīng)過對象適配器獲得一個懇求,并進(jìn)一步獲得該懇求的操作信經(jīng)過對象適配器獲得一個懇求,并進(jìn)一步獲得該懇求的操作信息息動態(tài)決議如何實現(xiàn)該對象動態(tài)決議如何實現(xiàn)該對象經(jīng)過對象適配器前往輸出結(jié)果經(jīng)
39、過對象適配器前往輸出結(jié)果需求實現(xiàn)需求實現(xiàn)DIR的例程要由特定對象實現(xiàn)實現(xiàn)的例程要由特定對象實現(xiàn)實現(xiàn)DynamicImplementation接口接口Interface DynamicImplementationvoid invoke();山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院import org.omg.CORBA.*;import org.omg.PortableServer.*;public class BankImpl extends org.omg.PortableServer.DynamicImplementation / 屬性的定義 protected java.util.Map accou
40、ntList;/ 一切賬戶的列表 protected ORB orb;/ 用于創(chuàng)建懇求對象的ORB偽對象 protected POA poa;/ 用于創(chuàng)建新對象援用的POApublic BankImpl(ORB orb, POA poa) accountList = new java.util.HashMap(); this.orb = orb; this.poa = poa; / ORB回調(diào)方法,是每一個采用DSI的對象實現(xiàn)都必需實現(xiàn)的方法需求實現(xiàn)該接口構(gòu)造方法,管理員開場時管理的賬戶清單為空3 程序?qū)嵗绦驅(qū)嵗綎|大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院 public void invoke(Server
41、Request request) / 根據(jù)當(dāng)前對象援用取對象標(biāo)識對Account而言,對象標(biāo)識就是賬戶名字 String objectId = new String(_object_id(); System.out.println(objectId + executing + request.operation() + () .); / 根據(jù)懇求對象中的操作名字分別處置 if (request.operation().equals(open) / 開設(shè)賬戶操作 try org.omg.CORBA.NVList paramList = orb.create_list(0); org.omg.CO
42、RBA.Any param = orb.create_any(); param.insert_string(); paramList.add_value(name, param, org.omg.CORBA.ARG_IN.value); request.arguments(paramList); String name = paramList.item(0).value().extract_string(); / 執(zhí)行開戶操作,在賬戶清單中查找或開設(shè)指定名字的賬戶 if (accountList.get(name) = null) java.util.Random random = new j
43、ava.util.Random(); float balance = Math.abs(random.nextInt() % 100000 / 100f; accountList.put(name, new Float(balance); System.out.println(新開賬戶: + name); org.omg.CORBA.Object account = poa.create_reference_with_id( name.getBytes(), IDL:Bank/Account:1.0); org.omg.CORBA.Any result = orb.create_any();
44、result.insert_Object(account); request.set_result(result); catch(Exception exc) exc.printStackTrace(); 從懇求對象中獲取實踐參數(shù)往懇求對象中填寫前往結(jié)果創(chuàng)建一any型,并填入“ 山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院 else if (request.operation().equals(deposit) / 存款操作 try / 根據(jù)對象標(biāo)識取賬戶余額 Float balance = (Float) accountList.get(objectId); if (balance = null) thro
45、w new org.omg.CORBA.BAD_PARAM(); / 從懇求對象中獲取參數(shù) org.omg.CORBA.NVList paramList = orb.create_list(0); org.omg.CORBA.Any param = orb.create_any(); param.insert_float(0); paramList.add_value(amount, param, org.omg.CORBA.ARG_IN.value); request.arguments(paramList); float amount = paramList.item(0).value()
46、.extract_float(); / 執(zhí)行存款操作 accountList.remove(objectId); accountList.put(objectId, new Float(balance.floatValue() + amount); / 該操作沒有前往結(jié)果 catch(Exception exc) exc.printStackTrace(); 山東大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院 else if (request.operation().equals(withdraw) / 取款操作 try / 根據(jù)對象標(biāo)識取賬戶余額 Float balance = (Float) accountLi
47、st.get(objectId); if (balance = null) throw new org.omg.CORBA.BAD_PARAM(); / 從懇求對象中獲取參數(shù) org.omg.CORBA.NVList paramList = orb.create_list(0); org.omg.CORBA.Any param = orb.create_any(); param.insert_float(0); paramList.add_value(amount, param, org.omg.CORBA.ARG_IN.value); request.arguments(paramList); float amount = paramList.item(0).value().extract_float(); / 執(zhí)行取款操作并填寫懇求對象中的前往結(jié)果 org.omg.CORBA.Any result = orb.create_any(); if (balance.floatValue() amount) result.insert_boolean(false)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年臨時電梯使用協(xié)議范本
- 2025年施工合同修改協(xié)議
- 2025年創(chuàng)業(yè)園區(qū)租賃協(xié)議
- 2025年交通工程安全事故補(bǔ)償協(xié)議
- 2025年三人合資企業(yè)合同范本
- 2025年離異家庭撫養(yǎng)權(quán)策劃安排合同
- 2025年住房及其周邊設(shè)施購買合同
- 2025年代理服務(wù)合同范文協(xié)議書
- 2025年策劃社團(tuán)聯(lián)合共創(chuàng)協(xié)議書
- 2025年交通項目合作實施協(xié)議書模板
- 秩序維護(hù)人員的績效考核規(guī)范
- 中醫(yī)診斷學(xué)八綱辨證課件
- QSB快速反應(yīng)看板
- 初中信息技術(shù)備課組工作計劃8篇
- 中國石油天然氣集團(tuán)公司建設(shè)項目其他費用和相關(guān)費用的規(guī)定
- 江蘇省城市規(guī)劃管理技術(shù)規(guī)定——蘇州市實施細(xì)則之二2021年版
- 大潔王槍水MSDS
- 勞務(wù)分包入住生活區(qū)承諾書
- 成績加權(quán)平均分計算器
- 直系親屬關(guān)系證明(存根)(共1頁)
評論
0/150
提交評論