第一章中間件 概述_第1頁
第一章中間件 概述_第2頁
第一章中間件 概述_第3頁
第一章中間件 概述_第4頁
第一章中間件 概述_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

中間件技術(shù)

————MiddlewareTechnology聯(lián)系方式鹿旭東Dongxul@.c算機(jī)軟件工程系先修課程面向?qū)ο蠹夹g(shù)Java語言程序設(shè)計軟件工程內(nèi)容簡介

中間件已經(jīng)成為構(gòu)建網(wǎng)絡(luò)分布式異構(gòu)信息系統(tǒng)不可缺少的關(guān)鍵技術(shù),與操作系統(tǒng)、數(shù)據(jù)庫管理系統(tǒng)并列為基礎(chǔ)軟件體系的三大支柱。本課程將闡述中間件產(chǎn)生的背景,中間件概念、定義及發(fā)展情況,中間件的功能、作用、特點(diǎn)、分類、優(yōu)越性、面臨的問題及發(fā)展趨勢。將以O(shè)MG組織的CORBA和Sun公司的EJB規(guī)范為例,闡述中間件基本框架、工作原理和實現(xiàn)的關(guān)鍵技術(shù)。并介紹當(dāng)前技術(shù)及相應(yīng)框架。

計算:從集中到分布計算模式的發(fā)展集中式計算模式桌面計算模式分布式計算模式軟件設(shè)計的基本思想(1)隱式地(implicitly)與顯式地(explicitly)兩種不同的支持方式對面向?qū)ο笤O(shè)計的支持對異常的支持對象約束的支持底層支持來解決分布式軟件的復(fù)雜性邏輯的(logical)與物理的(physical)不同的抽象層次抽象定義源于對復(fù)雜控制性的不足目的是在更高層次上掌握各種機(jī)制軟件設(shè)計的基本思想(2)面向?qū)ο蠹夹g(shù)本質(zhì)上是一個建模過程封裝、繼承、多態(tài)性有機(jī)融合分布式和面向?qū)ο蠹夹g(shù)RPC和RMICorbaEJBDCOM軟件體系結(jié)構(gòu)從體系結(jié)構(gòu)角度探討分布式軟件系統(tǒng)的有關(guān)問題分布式系統(tǒng)應(yīng)用一些典型的商務(wù)應(yīng)用系統(tǒng):股票交易系統(tǒng)銀行應(yīng)用系統(tǒng)客戶電話中心系統(tǒng)采購系統(tǒng)這些系統(tǒng)都應(yīng)是分布式系統(tǒng)現(xiàn)代應(yīng)用系統(tǒng)的基本特征分布任務(wù)已不只是在單機(jī)上運(yùn)行,而是由網(wǎng)絡(luò)中多臺計算機(jī)上的相關(guān)應(yīng)用共同協(xié)作完成,需考慮網(wǎng)絡(luò)傳輸、數(shù)據(jù)安全、數(shù)據(jù)一致性、同步等諸多問題;異構(gòu)計算機(jī)硬件、操作系統(tǒng)、網(wǎng)絡(luò)協(xié)議、數(shù)據(jù)庫系統(tǒng)以及開發(fā)工具種類繁多,需考慮數(shù)據(jù)表示、調(diào)用接口、處理方式等諸多問題;動態(tài)協(xié)作參與協(xié)作的應(yīng)用允許位置透明性、遷移透明性、負(fù)載平衡性等需求。傳統(tǒng)的Client/Server結(jié)構(gòu)數(shù)據(jù)庫ClientClientClient數(shù)據(jù)庫服務(wù)器服務(wù)器(數(shù)據(jù))層客戶層客戶向服務(wù)器請求數(shù)據(jù)庫服務(wù)廣義的C/S體系結(jié)構(gòu)信息提供和請求服務(wù)過程式程序設(shè)計中的過程調(diào)用接口(interface、規(guī)格說明)通信協(xié)議(參數(shù)傳遞風(fēng)格)分布式程序一般是C/S結(jié)構(gòu)的,重要的是接口和通信協(xié)議,此外還有可靠性、安全性、性能等因素2層結(jié)構(gòu)的缺陷2層結(jié)構(gòu)存在很多缺陷:客戶端的負(fù)擔(dān)仍比較重仍然需要客戶端進(jìn)行較復(fù)雜的數(shù)據(jù)處理客戶端的可移植性不好處理復(fù)雜必然牽涉更多的移植性問題每個客戶端上都要安裝數(shù)據(jù)庫驅(qū)動程序系統(tǒng)的可維護(hù)性不好客戶端包含過多的商業(yè)邏輯商業(yè)邏輯與人機(jī)交互界面交織在一起數(shù)據(jù)的安全性需求:需要更合理的工作分配——3層或多層結(jié)構(gòu)典型的3層結(jié)構(gòu)數(shù)據(jù)庫ClientClientClient數(shù)據(jù)庫服務(wù)器服務(wù)器(數(shù)據(jù))層中間層中間層服務(wù)器向數(shù)據(jù)庫服務(wù)器請求中間層應(yīng)用程序中間層客戶層客戶向中間層服務(wù)器請求3層結(jié)構(gòu)的優(yōu)點(diǎn)(1of2)除了更合理的分配任務(wù)外,3層結(jié)構(gòu)還具有如下優(yōu)點(diǎn):將業(yè)務(wù)邏輯放置在中間層可以提高系統(tǒng)的性能,使中間層的業(yè)務(wù)邏輯處理與數(shù)據(jù)層的業(yè)務(wù)數(shù)據(jù)緊密結(jié)合在一起,而無需考慮客戶的具體位置。添加新的中間層服務(wù)器能夠滿足新增客戶機(jī)的需求,可以大大提高3層系統(tǒng)的可伸縮性。將業(yè)務(wù)邏輯從客戶端移到中間層,在客戶層的應(yīng)用程序與數(shù)據(jù)層的數(shù)據(jù)庫之間增加了一層,這樣客戶端的應(yīng)用程序可以獨(dú)立于數(shù)據(jù)層的數(shù)據(jù)庫。3層結(jié)構(gòu)的優(yōu)點(diǎn)(2of2)將業(yè)務(wù)邏輯致于中間層,從而使業(yè)務(wù)邏輯集中到一處。而在2層方式下,業(yè)務(wù)邏輯被分散到所有的客戶機(jī)上(除非使用存儲過程)。這樣做是不可取的,因為業(yè)務(wù)規(guī)則是動態(tài)變化的,而對于這些業(yè)務(wù)而言,規(guī)范又是強(qiáng)制性的,所以,將業(yè)務(wù)邏輯分散到整個客戶層的客戶機(jī)上會使實施過程變得非常困難。大量的中間層中間件平臺提供豐富的系統(tǒng)級服務(wù),使得開發(fā)人員可以以更少的工作量開發(fā)出更復(fù)雜、可靠、高效的軟件系統(tǒng)。N層結(jié)構(gòu)在3層結(jié)構(gòu)中,客戶層和數(shù)據(jù)層已被嚴(yán)格定義,但中間層并未明確定義。中間層可以包括所有與應(yīng)用程序的界面和持久數(shù)據(jù)存儲無關(guān)的處理。假定將中間層劃分成許多服務(wù)程序是符合邏輯的,那么將每一主要服務(wù)都視為獨(dú)立的層,則3層結(jié)構(gòu)就成為了n層結(jié)構(gòu)。如中間層可以分為實現(xiàn)任務(wù)分配機(jī)制和界面呈現(xiàn)的Web服務(wù)器層和實現(xiàn)實際商業(yè)邏輯的EJB層。多層結(jié)構(gòu)問題分布異構(gòu)環(huán)境中,通常存在:多種硬件系統(tǒng)平臺,各種各樣的系統(tǒng)軟件,多種風(fēng)格各異的用戶界面,不同的網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)體系結(jié)構(gòu)連接。中間件的理解AnextensionoftheOSwhichprovidesatransparentcommunicationlayertotheapplications(操作系統(tǒng)的擴(kuò)展-透明的通訊)Thegluewhichconnectsobjectswhicharedistributedacrossmultipleheterogeneouscomputersystems(膠水-連接(管理)組件)位于操作系統(tǒng)和應(yīng)用軟件之間的一個軟件層,向各種應(yīng)用軟件提供服務(wù),使不同的應(yīng)用進(jìn)程能在屏蔽掉平臺差異的情況下,通過網(wǎng)絡(luò)互通信息。發(fā)展:通訊-服務(wù)-領(lǐng)域解決方案定義中間件是介于應(yīng)用系統(tǒng)和系統(tǒng)軟件之間的一類軟件它使用系統(tǒng)軟件所提供的基礎(chǔ)服務(wù)(功能),銜接網(wǎng)絡(luò)上應(yīng)用系統(tǒng)的各個部分或不同的應(yīng)用,能夠達(dá)到資源共享、功能共享的目的中間件的特性易用性位置透明性:應(yīng)用不必知道對方網(wǎng)絡(luò)和應(yīng)用的地址;不經(jīng)重新編譯,就可把一個應(yīng)用從一臺機(jī)器上轉(zhuǎn)移到另一臺機(jī)器消息傳輸?shù)耐暾裕合⒉粦?yīng)丟失或重復(fù)消息格式的完整性:消息格式不應(yīng)被破壞語言透明性:使用中間件的程序應(yīng)能與另一個用不同語言編寫的程序通信;如果用不同語言重寫一個程序,其他程序應(yīng)不受影響中間件分類遠(yuǎn)程過程中間件:RemoteProcedureCall,RPC消息中間件:Message-OrientedMiddleware(MOM)面向?qū)ο笾虚g件:Object-OrientedMiddleware事務(wù)處理中間件(TPMonitor)數(shù)據(jù)庫中間件其他分類:如安全中間件、網(wǎng)絡(luò)中間件、防病毒中間件等遠(yuǎn)程過程調(diào)用中間件在傳統(tǒng)的編程概念中,過程是由程序員在本地編譯完成,并只能局限在本地運(yùn)行的一段代碼,也就是說主程序和過程之間的運(yùn)行關(guān)系是本地調(diào)用關(guān)系。這種結(jié)構(gòu)在網(wǎng)絡(luò)日益發(fā)展的今天已無法適應(yīng)實際需求。其調(diào)用模式無法充分利用網(wǎng)絡(luò)上其他主機(jī)的資源(如計算資源、存儲資源、數(shù)據(jù)資源、顯示資源等),也無法提高代碼在實體間的共享程度,使得主機(jī)資源大量浪費(fèi)。本地過程調(diào)用的擴(kuò)展,可透明地調(diào)用遠(yuǎn)地提供的服務(wù)數(shù)據(jù)表示、可靠傳遞、服務(wù)定位等分布式計算環(huán)境,DCEMsRPC消息中間件(1)動機(jī):RPC調(diào)用的缺點(diǎn)(1)客戶端與服務(wù)器端需要同時在線;(2)客戶端需要知道服務(wù)器端的調(diào)用接口,若調(diào)用接口發(fā)生改變,客戶端需要做相應(yīng)變化,如通過ODBC連接訪問數(shù)據(jù)庫,客戶端需要知道遠(yuǎn)程數(shù)據(jù)庫的類型,若類型發(fā)生改變,還需要重新裝載相應(yīng)的驅(qū)動程序。(3)操作過程中需要一直保持與服務(wù)器端的連接,直到操作結(jié)束。因而,(a)一旦連接中斷,就意味著操作失敗或數(shù)據(jù)丟失;(b)通常判斷連接中斷的時間較長,若信道的可靠性較差,容易造成連接中斷,那么應(yīng)用效率將嚴(yán)重低下; (c)服務(wù)器端在執(zhí)行操作的過程中,并不涉及網(wǎng)上數(shù)據(jù)傳輸,但連接的保持占用信道,容易造成網(wǎng)絡(luò)堵塞。消息中間件(2)這個問題可用消息中間件來解決,應(yīng)用間通過傳遞消息來進(jìn)行協(xié)作,是一種異步通信模式主要功能是在不同的網(wǎng)絡(luò)協(xié)議、不同的操作系統(tǒng)和不同的應(yīng)用程序之間提供可靠的和可恢復(fù)的(若發(fā)生意外)消息傳送。工作原理:應(yīng)用之間以一系列消息的方式進(jìn)行通信。在消息傳遞過程中,為了避免消息被丟失,消息被保存在消息隊列中。應(yīng)用把消息發(fā)送到與接收者有關(guān)的隊列中。消息傳遞機(jī)制保證將消息傳送到目的地且只傳送一次。在消息傳遞過程中,應(yīng)用之間不必建立聯(lián)系,發(fā)送者僅需將消息放入到與接收者有關(guān)的隊列中,而不必關(guān)心接收者是否在線。接收者僅需從自己的隊列中提取消息即可。IBM的MQSeries、Microsoft的MSMQ、東方通的TongLink/Q、BEA的MessageQ事務(wù)處理中間件也稱為交易中間件常見功能全局事務(wù)協(xié)調(diào)事務(wù)的分布式兩階段提交資源管理器支持故障恢復(fù)負(fù)載平衡產(chǎn)品:Bea的Tuxedo等數(shù)據(jù)庫中間件實現(xiàn)對來自不同廠家的數(shù)據(jù)庫的訪問屏蔽操作系統(tǒng)、網(wǎng)絡(luò)協(xié)議、數(shù)據(jù)庫平臺等的差異應(yīng)用最廣泛、最成熟(1)通用網(wǎng)關(guān)接口CGI(駐留在WebServer上)(2)專用API:DLL形式

NSAPI(Netscape)ISAPI(Microsoft)(3)通用數(shù)據(jù)庫接口

JDBC(SUN)

ODBC(Microsoft)(4)數(shù)據(jù)庫引擎

Borland公司開發(fā),類似于ODBC,支持與數(shù)據(jù)庫的直接連接,效率較ODBC高(5)數(shù)據(jù)庫網(wǎng)關(guān)用于分布式應(yīng)用環(huán)境,無需在客戶機(jī)進(jìn)行各種配置,如安裝各種ODBC驅(qū)動、設(shè)置ODBC數(shù)據(jù)源等,使用網(wǎng)關(guān)來統(tǒng)一管理不同數(shù)據(jù)庫的訪問相關(guān)產(chǎn)品:EDA/SQL、RDA、DRDA對象在分布式環(huán)境中的表現(xiàn)傳統(tǒng)對象的關(guān)注點(diǎn):封裝和通過繼承對實現(xiàn)進(jìn)行重用。封裝提供了一種將對象實現(xiàn)細(xì)節(jié)與其他對象屏蔽開的嚴(yán)格方法,可以大大緩解在面向過程系統(tǒng)中較突出的維護(hù)問題。繼承提供了一種重用對象實現(xiàn)的簡便方法分布式環(huán)境要求更好的可插入性:不太關(guān)注于直接重用代碼,而是要求能夠利用遠(yuǎn)程所實現(xiàn)的服務(wù)。要求另一層次上的封裝,只需暴露公用接口對象——〉組件組件的特性(1of2)組件是一個嚴(yán)格定義的可插入單元組件一般是基于對象實現(xiàn)的,但也可以不作為對象實現(xiàn)。組件將封裝運(yùn)用到了極限組件通過封裝來隱藏組件的實現(xiàn)以達(dá)到:組件的實現(xiàn)語言是未知的:一個Java客戶不會感覺到所使用的組件是由C++實現(xiàn)的。組件的物理位置是未知的:一個VB客戶不會感覺到所使用的組件是運(yùn)行在相同的進(jìn)程內(nèi)(使用DLL),還是在同一機(jī)器的不同進(jìn)程內(nèi),甚至是位于不同機(jī)器上。組件的特性(2of2)組件通常在容器中進(jìn)行管理:組件遵循所處的容器的規(guī)則,并按照標(biāo)準(zhǔn)的途徑向容器發(fā)送事件。組件可以從容器中獲得屬性或服務(wù):例如,組件可以使用容器的背景色作為自己的背景色。組件允許對所支持的接口進(jìn)行動態(tài)發(fā)現(xiàn)和調(diào)用:客戶程序可以在運(yùn)行狀態(tài)下確定一個組件支持何種功能,然后調(diào)用該功能。組件化軟件系統(tǒng)的升級方式組件1組件2組件4組件3組件5組件6軟件系統(tǒng)版本1組件1‘組件2組件4組件3‘組件5組件6軟件系統(tǒng)版本1接口保持不變兩點(diǎn)說明組件不必是小的實體:組件不一定只是小的、可視化的東西,如VB控件面板的控件;一個大規(guī)模的、復(fù)雜組件例子就是IE內(nèi)使用的HTML查看器。組件及其容器不一定是可視化的:組件可能完全不可視(實際上一個分布式系統(tǒng)中的大多數(shù)組件都是不可視的)并實現(xiàn)業(yè)務(wù)邏輯。服務(wù)的重要性除了通信協(xié)議外,組件還會用到一些可能很復(fù)雜,但又會經(jīng)常重復(fù)使用的服務(wù)。如安全性管理、事務(wù)處理等。一個平臺或體系結(jié)構(gòu)所顯式提供的服務(wù)越多,開發(fā)者就越容易在更短的時間內(nèi)開發(fā)出高質(zhì)量的分布式系統(tǒng)。有了平臺提供的服務(wù),開發(fā)者可以將更多的精力集中于系統(tǒng)的商業(yè)邏輯。EJB是一個很好的例子常見的服務(wù)命名服務(wù)(Naming)在分布式系統(tǒng)中,命名服務(wù)提供了一種定位分布式對象的機(jī)制。監(jiān)視(Monitoring)監(jiān)視服務(wù)不僅可以監(jiān)視系統(tǒng)的運(yùn)行狀態(tài),而且當(dāng)需要操作人員參與時可以發(fā)出警告信息。持久性(Persistence)持久性服務(wù)提供一種統(tǒng)一的機(jī)制,使得分布式對象可以通過持久的數(shù)據(jù)存儲來保存、更新和恢復(fù)他的狀態(tài)。常見的服務(wù)(cont.)安全性(Security)安全性服務(wù)確保于分布式對象的通信是安全的,并確認(rèn)相應(yīng)的用戶具有適當(dāng)?shù)臋?quán)限。事務(wù)(Transaction)事務(wù)服務(wù)能夠確保一個事務(wù)或者完全完成,或者完全放棄。在企業(yè)系統(tǒng)中,事務(wù)定義了工作的原子級(atomic)單元。分布式事務(wù)處理就是一個跨越多臺計算機(jī)的單個工作單元。消息處理(Messaging)消息處理服務(wù)提供異步編程模式。異步模式在很多應(yīng)用中都需要。常見的服務(wù)(cont.)分布式垃圾回收(Distributedgarbagecollection)當(dāng)一個程序不再使用分布式對象時,分布式垃圾回收服務(wù)會自動釋放分布式對象所占用的存儲單元。資源管理(ResourceManagement)一般來說,資源管理器按照使可伸縮性最大化的方式來管理分布式對象,即支持大量的客戶程序同分布式對象在短時間內(nèi)進(jìn)行交互的能力。通信客戶程序與服務(wù)程序之間通信方式SocketRPCRMI抽象層次更高SocketSocket:面對TCP/IP協(xié)議編程,普遍采用Socket(套接字)規(guī)范,即UNIX習(xí)慣的TCP/IP基本編程方法,由一組圍繞Socket概念的函數(shù)調(diào)用支持,已經(jīng)成為TCP/IP應(yīng)用的標(biāo)準(zhǔn)手段。RPC:RPC是一種邏輯上的協(xié)議,它可以使用Socket、Named和Pipe等更低級的協(xié)議完成通信任務(wù)。RPC是在socket的基礎(chǔ)上實現(xiàn)的,RPC比socket需要更多的條件假定,更多的系統(tǒng)資源。RPC方法的基本原則是以模塊調(diào)用的簡單概念忽略通訊細(xì)節(jié),讓程序員不用關(guān)心C/S之間的通訊協(xié)議,集中精力對付實現(xiàn)過程。對于需要廣泛應(yīng)用和兼容的C/S應(yīng)用,由于其應(yīng)用平臺的多樣性和復(fù)雜性,可能在某些環(huán)境下不能提供對RPC編程方法的支持,這時必須知道通訊包的細(xì)節(jié),用RPC獲得簡單性的前提已經(jīng)被大大削弱??蛻艋诜?wù)器之間使用的大部分通訊組件都是基于socket接口來實現(xiàn)的。Socket是兩個程序之間進(jìn)行雙向數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)通訊端點(diǎn),有一個地址和一個端口號來標(biāo)識。每個服務(wù)程序在提供服務(wù)時都要在一個端口進(jìn)行,而想使用該服務(wù)的客戶機(jī)也必須連接該端口。因為是基于傳輸層,所以它是比較原始的通訊協(xié)議機(jī)制。通過Socket的數(shù)據(jù)表現(xiàn)形式為字節(jié)流信息,因此通訊雙方要想完成某項具體的應(yīng)用則必須按雙方約定的方式進(jìn)行數(shù)據(jù)的格式化和解釋

.*;

importjava.io.*;

publicclassSocketCommunicationServer

{

publicstaticvoidmain(String[]args)

try

{

booleanflag=true;//設(shè)置標(biāo)志位為真

Socketclient=null;//創(chuàng)建Socketclient以接收來自客戶端的請求

StringinputLine;/*1首先調(diào)用ServerSocket類以某個端口號為參數(shù),創(chuàng)建一個ServerSocket對象,即是服務(wù)器端的服務(wù)程序在該指定端口監(jiān)聽的Socket。*/

ServerSocket

serverSocket=newServerSocket(9000);//以端口9000創(chuàng)建一個服務(wù)器Socket

System.out.println("服務(wù)器在端口9000上監(jiān)聽");/*2服務(wù)器端程序使用ServerSocket對象的accept()方法,接收來自客戶機(jī)程序的連接請求,此時服務(wù)器端將一直保持停滯狀態(tài),直到收到客戶端發(fā)來的連接請求,此時該方法將返回一個新建的Socket類的實例,代表和客戶機(jī)建立的通訊鏈路在服務(wù)程序內(nèi)的通訊端點(diǎn)。如果采用Java的多線程編程方法,可以實現(xiàn)并發(fā)服務(wù)器,繼續(xù)監(jiān)聽來自其他客戶的連接請求。*/

while(flag)

{

client=serverSocket.accept();/*3使用新建的Socket對象創(chuàng)建輸入、輸出流對象。*/

DataInputStreaminput=newDataInputStream(new

BufferedInputStream(client.getInputStream()));

PrintStreamoutput=newPrintStream(new

BufferedOutputStream(client.getOutputStream());/*4使用流對象的方法完成和客戶端的數(shù)據(jù)傳輸,按約定協(xié)議識別并處理來自客戶端的請求數(shù)據(jù),并把處理的結(jié)果返回給客戶端。*/

while((inputLine=input.readLine())!=null)

{

if(inputLine.equals("Stop"))

{

flag=false;

break;

}

output.println(inputLine);

output.flush();

}/*5客戶端工作完畢后,則服務(wù)器端程序關(guān)閉和客戶端通訊的流和通訊的Socket。*/

output.close();

input.close();

client.close();

}/*6在服務(wù)器程序運(yùn)行結(jié)束之間,應(yīng)當(dāng)關(guān)閉用來監(jiān)聽的Socket.*/

serverSocket.close();

}catch(IOExceptione){}

}

}

}

importjava.io.*;

.*;

publicclassSocketCommunicationClient

{

publicstaticvoidmain(String[]args)

{

try{/*1首先調(diào)用Socket類的構(gòu)造函數(shù),以服務(wù)器的指定的IP地址或指定的主機(jī)名和指定的端口號為參數(shù),創(chuàng)建一個Socket流,在創(chuàng)建Socket流的過程中包含了向服務(wù)器請求建立通訊連接的過程實現(xiàn)。*/

SocketclientSocket=newSocket("mice",9000);//創(chuàng)建一個流Socket并與主機(jī)mice上的端口9000相連接/*2使用Socket的方法getInputStream()和getOutputStream()來創(chuàng)建輸入/輸出流。這樣,使用Socket類后,網(wǎng)絡(luò)輸入輸出也轉(zhuǎn)化為使用流對象的過程。*/

OutputStreamoutput=clientSocket.getOutputStream();//向此Socket寫入字節(jié)的一個輸出流

DataInputStreaminput=newDataInputStream(clientSocket.getInputStream());

intc;/*3使用輸入輸出流對象的相應(yīng)方法讀寫字節(jié)流數(shù)據(jù),因為流連接著通訊所用的Socket,Socket又是和服務(wù)器端建立連接的一個端點(diǎn),因此數(shù)據(jù)將通過連接從服務(wù)器得到或發(fā)向服務(wù)器。這時我們就可以對字節(jié)流數(shù)據(jù)按客戶端和服務(wù)器之間的協(xié)議進(jìn)行處理,完成雙方的通訊任務(wù)。*/

Stringresponse;

while((c=System.in.read())!=-1)//從屏幕上接受輸入的字符串,并且分解成一個個字符

{

output.write((byte)c);

if(c=='\n')//如果字符為回車,則輸出字符串緩沖

{

output.flush();

response=input.readLine();

System.out.println("Communication:"+response);

}

}/*待通訊任務(wù)完畢后,我們用流對象的close()方法來關(guān)閉用于網(wǎng)絡(luò)通訊的輸入輸出流,在用Socket對象的close()方法來關(guān)閉Socket。*/

output.close();

input.close();

clientSocket.close();

}catch(Exceptione){

System.err.println("Exception:"+e);

}

}

}RMI在java分布式對象模型中,遠(yuǎn)程對象是指它的方法可以從另外一個位于不同主機(jī)上的java虛擬機(jī)來調(diào)用的對象。該對象采用一個或多個遠(yuǎn)程接口進(jìn)行描述,這些接口聲明了遠(yuǎn)程對象的方法。RMI(遠(yuǎn)程方法調(diào)用)就是對一個遠(yuǎn)程對象的遠(yuǎn)程接口中的方法進(jìn)行調(diào)用RMI的目的是要使運(yùn)行在不同的計算機(jī)中的對象之間的調(diào)用表現(xiàn)得象本地調(diào)用一樣RMI應(yīng)用程序包括兩個獨(dú)立程序:server和client程序。RMI存在于客戶端遠(yuǎn)程對象的本地映象:調(diào)用遠(yuǎn)程對象時,實際調(diào)用的是存根對象上的方法負(fù)責(zé)初始化并與遠(yuǎn)程對象所在的遠(yuǎn)程VM連接將參數(shù)打包,傳遞到遠(yuǎn)程VM等待方法調(diào)用的結(jié)果解包返回值和異常將值返回給調(diào)用者存根(stub)框架存在于服務(wù)器接收客戶存根的請求和真正的遠(yuǎn)程對象進(jìn)行交互傳送服務(wù)器響應(yīng)到客戶負(fù)責(zé)解包客戶端輸入的遠(yuǎn)程方法的參數(shù)調(diào)用實際的遠(yuǎn)程對象的方法將結(jié)果打包返回給調(diào)用者傳至遠(yuǎn)程引用層遠(yuǎn)程引用層和傳輸層遠(yuǎn)程引用層負(fù)責(zé)為獨(dú)立于stub/skeleton的多種形式的遠(yuǎn)程引用和調(diào)用協(xié)議提供支持傳輸層負(fù)責(zé)在不同的地址空間內(nèi)傳輸序列化的字節(jié)流,使用TCP/UDP傳輸RMIregistry簡單的命名和查找遠(yuǎn)程對象的服務(wù)遠(yuǎn)程對象在服務(wù)器端注冊客戶能夠發(fā)現(xiàn)遠(yuǎn)程對象和找到遠(yuǎn)程對象引用RMI系統(tǒng)體系結(jié)構(gòu)ClientVirtualMachineClientServerVirtualMachineStubRemoteObjectSkeletonRegistryVirtualMachine“Fred”ServerRMI流程(1)ClientVirtualMachineClientServerVirtualMachineStubRemoteObjectSkeletonRegistryVirtualMachine“Fred”Server121.ServerCreatesRemoteObject

2.ServerRegistersRemoteObjectRMI流程(2)ClientVirtualMachineClientServerVirtualMachineStubRemoteObjectSkeletonRegistryVirtualMachine“Fred”Server43.ClientrequestsobjectfromRegistry4.Registryreturnsremotereference(andstubgetscreated)3RMI流程(3)ClientVirtualMachineClientServerVirtualMachineStubRemoteObjectSkeletonRegistryVirtualMachine“Fred”Server65.Clientinvokesstubmethod6.Stubtalkstoskeleton7.Skeletoninvokesremoteobjectmethod57基于RMI的程序組成遠(yuǎn)程對象接口遠(yuǎn)程對象實現(xiàn)服務(wù)程序客戶程序接口和類一個簡單的RMI例子1.遠(yuǎn)程對象的本地接口聲明(RMIOperate.java)該類僅僅是一個接口聲明,RMI客戶機(jī)可以直接使用它,RMI服務(wù)器必須通過一個遠(yuǎn)程對象來實現(xiàn)它,并用某個專有的URL注冊它的一個實例。

遠(yuǎn)程接口擴(kuò)展java.rmi.Remote

接口。除了所有應(yīng)用程序特定的例外之外,每個方法還必須在

throws子句中聲明java.rmi.RemoteException(或RemoteException

的父類)。Hello.javaimport

java.rmi.*;//RMI本地接口必須從Remote接口派生public

interfaceHelloextendsRemote{//接口中的具體方法聲明,注意必須聲明拋出RemoteException

String

sayHello(Stringname)throws

RemoteException;}2、遠(yuǎn)程對象實現(xiàn)類

這個類應(yīng)實現(xiàn)RMI客戶機(jī)調(diào)用的遠(yuǎn)程服務(wù)對象的本地接口,它必須從UnicastRemoteObject或PortableRemoteObject繼承,構(gòu)造函數(shù)應(yīng)拋出RemoteException異常。

HelloImpl.javaimport

java.rmi.*;import

javax.rmi.PortableRemoteObject;public

class

HelloImpl

extends

PortableRemoteObject

implementsHello{/*構(gòu)造函數(shù)*/

public

HelloImpl()throws

RemoteException{super();}/*實現(xiàn)本地接口中聲明的'sayHello()'方法*/

public

String

sayHello(Stringmessage)throws

RemoteException{ System.out.println("我在RMI的服務(wù)器端,客戶端正在調(diào)用'sayHello'方法。");System.out.println("Hello"+message);returnmessage;}}3.RMI服務(wù)器類該類創(chuàng)建遠(yuǎn)程對象實現(xiàn)類HelloImpl的一個實例,然后通過一個專有的URL來注冊它。所謂注冊就是通過Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,將HelloImpl實例綁定到指定的URL上。HelloServer.javaimportjava.rmi.*;publicclassHelloServer{publicstaticvoidmain(String[]args){try{

System.out.println("開始RMIServer...");/*創(chuàng)建遠(yuǎn)程對象的實現(xiàn)實例*/

HelloImpl

hImpl=newHelloImpl();

System.out.println("將實例注冊到專有的URL");

Naming.rebind("HelloService",hImpl);

System.out.println("等待RMI客戶端調(diào)用...");

System.out.println("");}catch(Exceptione){

System.out.println("錯誤:"+e);}}}請注意有關(guān)rebind方法調(diào)用的下列參數(shù):第一個參數(shù)是URL格式的java.lang.String,表示遠(yuǎn)程對象的位置和名字。如果URL中省略主機(jī),則主機(jī)缺省值為當(dāng)前主機(jī),而且在URL中無需指定協(xié)議(例如“HelloServer”)。在URL中,可以選擇提供端口號:例如“//myhost:1234/HelloServer”。端口缺省值為1099。除非服務(wù)器在缺省1099端口上創(chuàng)建注冊服務(wù)程序,否則需要指定端口號。第二個參數(shù)為從中調(diào)用遠(yuǎn)程方法的對象實現(xiàn)引用。

RMI客戶使用java.rmi.Naming.lookup()方法,在指定的遠(yuǎn)程主機(jī)上查找RMI服務(wù)對象,若找到就把它轉(zhuǎn)換成本地接口RMIOperate類型。它必須知道提供RMI服務(wù)主機(jī)的URL,這個URL可以通過rmi://host/path或rmi://host:port/path來指定,如果省略端口號,就默認(rèn)使用1099。

Java.rmi.Naming.lookup()方法可能產(chǎn)生三個異常:Java.rmi.RemoteException、Java.rmi.NotBoundException、.MalformedURLException,三個異常都需要捕獲。HelloClient.java/**/importjava.rmi.*;publicclassHelloClient{publicstaticvoidmain(String[]args){/*默認(rèn)為本地主機(jī)和默認(rèn)端口*/Stringhost="localhost:1099";/*帶輸入?yún)?shù)時,將host設(shè)置為指定主機(jī)*/if(args.length>0)host=args[0];t

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論