




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
中間件技術(shù)
————MiddlewareTechnology聯(lián)系方式鹿旭東Dongxul@.c算機(jī)軟件工程系先修課程面向?qū)ο蠹夹g(shù)Java語言程序設(shè)計(jì)軟件工程內(nèi)容簡(jiǎn)介
中間件已經(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ā)展趨勢(shì)。將以O(shè)MG組織的CORBA和Sun公司的EJB規(guī)范為例,闡述中間件基本框架、工作原理和實(shí)現(xiàn)的關(guān)鍵技術(shù)。并介紹當(dāng)前技術(shù)及相應(yīng)框架。
計(jì)算:從集中到分布計(jì)算模式的發(fā)展集中式計(jì)算模式桌面計(jì)算模式分布式計(jì)算模式軟件設(shè)計(jì)的基本思想(1)隱式地(implicitly)與顯式地(explicitly)兩種不同的支持方式對(duì)面向?qū)ο笤O(shè)計(jì)的支持對(duì)異常的支持對(duì)象約束的支持底層支持來解決分布式軟件的復(fù)雜性邏輯的(logical)與物理的(physical)不同的抽象層次抽象定義源于對(duì)復(fù)雜控制性的不足目的是在更高層次上掌握各種機(jī)制軟件設(shè)計(jì)的基本思想(2)面向?qū)ο蠹夹g(shù)本質(zhì)上是一個(gè)建模過程封裝、繼承、多態(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ò)中多臺(tái)計(jì)算機(jī)上的相關(guān)應(yīng)用共同協(xié)作完成,需考慮網(wǎng)絡(luò)傳輸、數(shù)據(jù)安全、數(shù)據(jù)一致性、同步等諸多問題;異構(gòu)計(jì)算機(jī)硬件、操作系統(tǒng)、網(wǎng)絡(luò)協(xié)議、數(shù)據(jù)庫系統(tǒng)以及開發(fā)工具種類繁多,需考慮數(shù)據(jù)表示、調(diào)用接口、處理方式等諸多問題;動(dòng)態(tài)協(xié)作參與協(xié)作的應(yīng)用允許位置透明性、遷移透明性、負(fù)載平衡性等需求。傳統(tǒng)的Client/Server結(jié)構(gòu)數(shù)據(jù)庫ClientClientClient數(shù)據(jù)庫服務(wù)器服務(wù)器(數(shù)據(jù))層客戶層客戶向服務(wù)器請(qǐng)求數(shù)據(jù)庫服務(wù)廣義的C/S體系結(jié)構(gòu)信息提供和請(qǐng)求服務(wù)過程式程序設(shè)計(jì)中的過程調(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ù)雜必然牽涉更多的移植性問題每個(gè)客戶端上都要安裝數(shù)據(jù)庫驅(qū)動(dòng)程序系統(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ù)器請(qǐng)求中間層應(yīng)用程序中間層客戶層客戶向中間層服務(wù)器請(qǐng)求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ī)上(除非使用存儲(chǔ)過程)。這樣做是不可取的,因?yàn)闃I(yè)務(wù)規(guī)則是動(dòng)態(tài)變化的,而對(duì)于這些業(yè)務(wù)而言,規(guī)范又是強(qiáng)制性的,所以,將業(yè)務(wù)邏輯分散到整個(gè)客戶層的客戶機(jī)上會(huì)使實(shí)施過程變得非常困難。大量的中間層中間件平臺(tái)提供豐富的系統(tǒng)級(jí)服務(wù),使得開發(fā)人員可以以更少的工作量開發(fā)出更復(fù)雜、可靠、高效的軟件系統(tǒng)。N層結(jié)構(gòu)在3層結(jié)構(gòu)中,客戶層和數(shù)據(jù)層已被嚴(yán)格定義,但中間層并未明確定義。中間層可以包括所有與應(yīng)用程序的界面和持久數(shù)據(jù)存儲(chǔ)無關(guān)的處理。假定將中間層劃分成許多服務(wù)程序是符合邏輯的,那么將每一主要服務(wù)都視為獨(dú)立的層,則3層結(jié)構(gòu)就成為了n層結(jié)構(gòu)。如中間層可以分為實(shí)現(xiàn)任務(wù)分配機(jī)制和界面呈現(xiàn)的Web服務(wù)器層和實(shí)現(xiàn)實(shí)際商業(yè)邏輯的EJB層。多層結(jié)構(gòu)問題分布異構(gòu)環(huán)境中,通常存在:多種硬件系統(tǒng)平臺(tái),各種各樣的系統(tǒng)軟件,多種風(fēng)格各異的用戶界面,不同的網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)體系結(jié)構(gòu)連接。中間件的理解AnextensionoftheOSwhichprovidesatransparentcommunicationlayertotheapplications(操作系統(tǒng)的擴(kuò)展-透明的通訊)Thegluewhichconnectsobjectswhicharedistributedacrossmultipleheterogeneouscomputersystems(膠水-連接(管理)組件)位于操作系統(tǒng)和應(yīng)用軟件之間的一個(gè)軟件層,向各種應(yīng)用軟件提供服務(wù),使不同的應(yīng)用進(jìn)程能在屏蔽掉平臺(tái)差異的情況下,通過網(wǎng)絡(luò)互通信息。發(fā)展:通訊-服務(wù)-領(lǐng)域解決方案定義中間件是介于應(yīng)用系統(tǒng)和系統(tǒng)軟件之間的一類軟件它使用系統(tǒng)軟件所提供的基礎(chǔ)服務(wù)(功能),銜接網(wǎng)絡(luò)上應(yīng)用系統(tǒng)的各個(gè)部分或不同的應(yīng)用,能夠達(dá)到資源共享、功能共享的目的中間件的特性易用性位置透明性:應(yīng)用不必知道對(duì)方網(wǎng)絡(luò)和應(yīng)用的地址;不經(jīng)重新編譯,就可把一個(gè)應(yīng)用從一臺(tái)機(jī)器上轉(zhuǎn)移到另一臺(tái)機(jī)器消息傳輸?shù)耐暾裕合⒉粦?yīng)丟失或重復(fù)消息格式的完整性:消息格式不應(yīng)被破壞語言透明性:使用中間件的程序應(yīng)能與另一個(gè)用不同語言編寫的程序通信;如果用不同語言重寫一個(gè)程序,其他程序應(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)實(shí)際需求。其調(diào)用模式無法充分利用網(wǎng)絡(luò)上其他主機(jī)的資源(如計(jì)算資源、存儲(chǔ)資源、數(shù)據(jù)資源、顯示資源等),也無法提高代碼在實(shí)體間的共享程度,使得主機(jī)資源大量浪費(fèi)。本地過程調(diào)用的擴(kuò)展,可透明地調(diào)用遠(yuǎn)地提供的服務(wù)數(shù)據(jù)表示、可靠傳遞、服務(wù)定位等分布式計(jì)算環(huán)境,DCEMsRPC消息中間件(1)動(dòng)機(jī):RPC調(diào)用的缺點(diǎn)(1)客戶端與服務(wù)器端需要同時(shí)在線;(2)客戶端需要知道服務(wù)器端的調(diào)用接口,若調(diào)用接口發(fā)生改變,客戶端需要做相應(yīng)變化,如通過ODBC連接訪問數(shù)據(jù)庫,客戶端需要知道遠(yuǎn)程數(shù)據(jù)庫的類型,若類型發(fā)生改變,還需要重新裝載相應(yīng)的驅(qū)動(dòng)程序。(3)操作過程中需要一直保持與服務(wù)器端的連接,直到操作結(jié)束。因而,(a)一旦連接中斷,就意味著操作失敗或數(shù)據(jù)丟失;(b)通常判斷連接中斷的時(shí)間較長,若信道的可靠性較差,容易造成連接中斷,那么應(yīng)用效率將嚴(yán)重低下; (c)服務(wù)器端在執(zhí)行操作的過程中,并不涉及網(wǎng)上數(shù)據(jù)傳輸,但連接的保持占用信道,容易造成網(wǎng)絡(luò)堵塞。消息中間件(2)這個(gè)問題可用消息中間件來解決,應(yīng)用間通過傳遞消息來進(jìn)行協(xié)作,是一種異步通信模式主要功能是在不同的網(wǎng)絡(luò)協(xié)議、不同的操作系統(tǒng)和不同的應(yīng)用程序之間提供可靠的和可恢復(fù)的(若發(fā)生意外)消息傳送。工作原理:應(yīng)用之間以一系列消息的方式進(jìn)行通信。在消息傳遞過程中,為了避免消息被丟失,消息被保存在消息隊(duì)列中。應(yīng)用把消息發(fā)送到與接收者有關(guān)的隊(duì)列中。消息傳遞機(jī)制保證將消息傳送到目的地且只傳送一次。在消息傳遞過程中,應(yīng)用之間不必建立聯(lián)系,發(fā)送者僅需將消息放入到與接收者有關(guān)的隊(duì)列中,而不必關(guān)心接收者是否在線。接收者僅需從自己的隊(duì)列中提取消息即可。IBM的MQSeries、Microsoft的MSMQ、東方通的TongLink/Q、BEA的MessageQ事務(wù)處理中間件也稱為交易中間件常見功能全局事務(wù)協(xié)調(diào)事務(wù)的分布式兩階段提交資源管理器支持故障恢復(fù)負(fù)載平衡產(chǎn)品:Bea的Tuxedo等數(shù)據(jù)庫中間件實(shí)現(xiàn)對(duì)來自不同廠家的數(shù)據(jù)庫的訪問屏蔽操作系統(tǒng)、網(wǎng)絡(luò)協(xié)議、數(shù)據(jù)庫平臺(tái)等的差異應(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ū)動(dòng)、設(shè)置ODBC數(shù)據(jù)源等,使用網(wǎng)關(guān)來統(tǒng)一管理不同數(shù)據(jù)庫的訪問相關(guān)產(chǎn)品:EDA/SQL、RDA、DRDA對(duì)象在分布式環(huán)境中的表現(xiàn)傳統(tǒng)對(duì)象的關(guān)注點(diǎn):封裝和通過繼承對(duì)實(shí)現(xiàn)進(jìn)行重用。封裝提供了一種將對(duì)象實(shí)現(xiàn)細(xì)節(jié)與其他對(duì)象屏蔽開的嚴(yán)格方法,可以大大緩解在面向過程系統(tǒng)中較突出的維護(hù)問題。繼承提供了一種重用對(duì)象實(shí)現(xiàn)的簡(jiǎn)便方法分布式環(huán)境要求更好的可插入性:不太關(guān)注于直接重用代碼,而是要求能夠利用遠(yuǎn)程所實(shí)現(xiàn)的服務(wù)。要求另一層次上的封裝,只需暴露公用接口對(duì)象——〉組件組件的特性(1of2)組件是一個(gè)嚴(yán)格定義的可插入單元組件一般是基于對(duì)象實(shí)現(xiàn)的,但也可以不作為對(duì)象實(shí)現(xiàn)。組件將封裝運(yùn)用到了極限組件通過封裝來隱藏組件的實(shí)現(xiàn)以達(dá)到:組件的實(shí)現(xiàn)語言是未知的:一個(gè)Java客戶不會(huì)感覺到所使用的組件是由C++實(shí)現(xiàn)的。組件的物理位置是未知的:一個(gè)VB客戶不會(huì)感覺到所使用的組件是運(yùn)行在相同的進(jìn)程內(nèi)(使用DLL),還是在同一機(jī)器的不同進(jìn)程內(nèi),甚至是位于不同機(jī)器上。組件的特性(2of2)組件通常在容器中進(jìn)行管理:組件遵循所處的容器的規(guī)則,并按照標(biāo)準(zhǔn)的途徑向容器發(fā)送事件。組件可以從容器中獲得屬性或服務(wù):例如,組件可以使用容器的背景色作為自己的背景色。組件允許對(duì)所支持的接口進(jìn)行動(dòng)態(tài)發(fā)現(xiàn)和調(diào)用:客戶程序可以在運(yùn)行狀態(tài)下確定一個(gè)組件支持何種功能,然后調(diào)用該功能。組件化軟件系統(tǒng)的升級(jí)方式組件1組件2組件4組件3組件5組件6軟件系統(tǒng)版本1組件1‘組件2組件4組件3‘組件5組件6軟件系統(tǒng)版本1接口保持不變兩點(diǎn)說明組件不必是小的實(shí)體:組件不一定只是小的、可視化的東西,如VB控件面板的控件;一個(gè)大規(guī)模的、復(fù)雜組件例子就是IE內(nèi)使用的HTML查看器。組件及其容器不一定是可視化的:組件可能完全不可視(實(shí)際上一個(gè)分布式系統(tǒng)中的大多數(shù)組件都是不可視的)并實(shí)現(xiàn)業(yè)務(wù)邏輯。服務(wù)的重要性除了通信協(xié)議外,組件還會(huì)用到一些可能很復(fù)雜,但又會(huì)經(jīng)常重復(fù)使用的服務(wù)。如安全性管理、事務(wù)處理等。一個(gè)平臺(tái)或體系結(jié)構(gòu)所顯式提供的服務(wù)越多,開發(fā)者就越容易在更短的時(shí)間內(nèi)開發(fā)出高質(zhì)量的分布式系統(tǒng)。有了平臺(tái)提供的服務(wù),開發(fā)者可以將更多的精力集中于系統(tǒng)的商業(yè)邏輯。EJB是一個(gè)很好的例子常見的服務(wù)命名服務(wù)(Naming)在分布式系統(tǒng)中,命名服務(wù)提供了一種定位分布式對(duì)象的機(jī)制。監(jiān)視(Monitoring)監(jiān)視服務(wù)不僅可以監(jiān)視系統(tǒng)的運(yùn)行狀態(tài),而且當(dāng)需要操作人員參與時(shí)可以發(fā)出警告信息。持久性(Persistence)持久性服務(wù)提供一種統(tǒng)一的機(jī)制,使得分布式對(duì)象可以通過持久的數(shù)據(jù)存儲(chǔ)來保存、更新和恢復(fù)他的狀態(tài)。常見的服務(wù)(cont.)安全性(Security)安全性服務(wù)確保于分布式對(duì)象的通信是安全的,并確認(rèn)相應(yīng)的用戶具有適當(dāng)?shù)臋?quán)限。事務(wù)(Transaction)事務(wù)服務(wù)能夠確保一個(gè)事務(wù)或者完全完成,或者完全放棄。在企業(yè)系統(tǒng)中,事務(wù)定義了工作的原子級(jí)(atomic)單元。分布式事務(wù)處理就是一個(gè)跨越多臺(tái)計(jì)算機(jī)的單個(gè)工作單元。消息處理(Messaging)消息處理服務(wù)提供異步編程模式。異步模式在很多應(yīng)用中都需要。常見的服務(wù)(cont.)分布式垃圾回收(Distributedgarbagecollection)當(dāng)一個(gè)程序不再使用分布式對(duì)象時(shí),分布式垃圾回收服務(wù)會(huì)自動(dòng)釋放分布式對(duì)象所占用的存儲(chǔ)單元。資源管理(ResourceManagement)一般來說,資源管理器按照使可伸縮性最大化的方式來管理分布式對(duì)象,即支持大量的客戶程序同分布式對(duì)象在短時(shí)間內(nèi)進(jìn)行交互的能力。通信客戶程序與服務(wù)程序之間通信方式SocketRPCRMI抽象層次更高SocketSocket:面對(duì)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等更低級(jí)的協(xié)議完成通信任務(wù)。RPC是在socket的基礎(chǔ)上實(shí)現(xiàn)的,RPC比socket需要更多的條件假定,更多的系統(tǒng)資源。RPC方法的基本原則是以模塊調(diào)用的簡(jiǎn)單概念忽略通訊細(xì)節(jié),讓程序員不用關(guān)心C/S之間的通訊協(xié)議,集中精力對(duì)付實(shí)現(xiàn)過程。對(duì)于需要廣泛應(yīng)用和兼容的C/S應(yīng)用,由于其應(yīng)用平臺(tái)的多樣性和復(fù)雜性,可能在某些環(huán)境下不能提供對(duì)RPC編程方法的支持,這時(shí)必須知道通訊包的細(xì)節(jié),用RPC獲得簡(jiǎn)單性的前提已經(jīng)被大大削弱??蛻艋诜?wù)器之間使用的大部分通訊組件都是基于socket接口來實(shí)現(xiàn)的。Socket是兩個(gè)程序之間進(jìn)行雙向數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)通訊端點(diǎn),有一個(gè)地址和一個(gè)端口號(hào)來標(biāo)識(shí)。每個(gè)服務(wù)程序在提供服務(wù)時(shí)都要在一個(gè)端口進(jìn)行,而想使用該服務(wù)的客戶機(jī)也必須連接該端口。因?yàn)槭腔趥鬏攲?,所以它是比較原始的通訊協(xié)議機(jī)制。通過Socket的數(shù)據(jù)表現(xiàn)形式為字節(jié)流信息,因此通訊雙方要想完成某項(xiàng)具體的應(yīng)用則必須按雙方約定的方式進(jìn)行數(shù)據(jù)的格式化和解釋
.*;
importjava.io.*;
publicclassSocketCommunicationServer
{
publicstaticvoidmain(String[]args)
try
{
booleanflag=true;//設(shè)置標(biāo)志位為真
Socketclient=null;//創(chuàng)建Socketclient以接收來自客戶端的請(qǐng)求
StringinputLine;/*1首先調(diào)用ServerSocket類以某個(gè)端口號(hào)為參數(shù),創(chuàng)建一個(gè)ServerSocket對(duì)象,即是服務(wù)器端的服務(wù)程序在該指定端口監(jiān)聽的Socket。*/
ServerSocket
serverSocket=newServerSocket(9000);//以端口9000創(chuàng)建一個(gè)服務(wù)器Socket
System.out.println("服務(wù)器在端口9000上監(jiān)聽");/*2服務(wù)器端程序使用ServerSocket對(duì)象的accept()方法,接收來自客戶機(jī)程序的連接請(qǐng)求,此時(shí)服務(wù)器端將一直保持停滯狀態(tài),直到收到客戶端發(fā)來的連接請(qǐng)求,此時(shí)該方法將返回一個(gè)新建的Socket類的實(shí)例,代表和客戶機(jī)建立的通訊鏈路在服務(wù)程序內(nèi)的通訊端點(diǎn)。如果采用Java的多線程編程方法,可以實(shí)現(xiàn)并發(fā)服務(wù)器,繼續(xù)監(jiān)聽來自其他客戶的連接請(qǐng)求。*/
while(flag)
{
client=serverSocket.accept();/*3使用新建的Socket對(duì)象創(chuàng)建輸入、輸出流對(duì)象。*/
DataInputStreaminput=newDataInputStream(new
BufferedInputStream(client.getInputStream()));
PrintStreamoutput=newPrintStream(new
BufferedOutputStream(client.getOutputStream());/*4使用流對(duì)象的方法完成和客戶端的數(shù)據(jù)傳輸,按約定協(xié)議識(shí)別并處理來自客戶端的請(qǐng)求數(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ī)名和指定的端口號(hào)為參數(shù),創(chuàng)建一個(gè)Socket流,在創(chuàng)建Socket流的過程中包含了向服務(wù)器請(qǐng)求建立通訊連接的過程實(shí)現(xiàn)。*/
SocketclientSocket=newSocket("mice",9000);//創(chuàng)建一個(gè)流Socket并與主機(jī)mice上的端口9000相連接/*2使用Socket的方法getInputStream()和getOutputStream()來創(chuàng)建輸入/輸出流。這樣,使用Socket類后,網(wǎng)絡(luò)輸入輸出也轉(zhuǎn)化為使用流對(duì)象的過程。*/
OutputStreamoutput=clientSocket.getOutputStream();//向此Socket寫入字節(jié)的一個(gè)輸出流
DataInputStreaminput=newDataInputStream(clientSocket.getInputStream());
intc;/*3使用輸入輸出流對(duì)象的相應(yīng)方法讀寫字節(jié)流數(shù)據(jù),因?yàn)榱鬟B接著通訊所用的Socket,Socket又是和服務(wù)器端建立連接的一個(gè)端點(diǎn),因此數(shù)據(jù)將通過連接從服務(wù)器得到或發(fā)向服務(wù)器。這時(shí)我們就可以對(duì)字節(jié)流數(shù)據(jù)按客戶端和服務(wù)器之間的協(xié)議進(jìn)行處理,完成雙方的通訊任務(wù)。*/
Stringresponse;
while((c=System.in.read())!=-1)//從屏幕上接受輸入的字符串,并且分解成一個(gè)個(gè)字符
{
output.write((byte)c);
if(c=='\n')//如果字符為回車,則輸出字符串緩沖
{
output.flush();
response=input.readLine();
System.out.println("Communication:"+response);
}
}/*待通訊任務(wù)完畢后,我們用流對(duì)象的close()方法來關(guān)閉用于網(wǎng)絡(luò)通訊的輸入輸出流,在用Socket對(duì)象的close()方法來關(guān)閉Socket。*/
output.close();
input.close();
clientSocket.close();
}catch(Exceptione){
System.err.println("Exception:"+e);
}
}
}RMI在java分布式對(duì)象模型中,遠(yuǎn)程對(duì)象是指它的方法可以從另外一個(gè)位于不同主機(jī)上的java虛擬機(jī)來調(diào)用的對(duì)象。該對(duì)象采用一個(gè)或多個(gè)遠(yuǎn)程接口進(jìn)行描述,這些接口聲明了遠(yuǎn)程對(duì)象的方法。RMI(遠(yuǎn)程方法調(diào)用)就是對(duì)一個(gè)遠(yuǎn)程對(duì)象的遠(yuǎn)程接口中的方法進(jìn)行調(diào)用RMI的目的是要使運(yùn)行在不同的計(jì)算機(jī)中的對(duì)象之間的調(diào)用表現(xiàn)得象本地調(diào)用一樣RMI應(yīng)用程序包括兩個(gè)獨(dú)立程序:server和client程序。RMI存在于客戶端遠(yuǎn)程對(duì)象的本地映象:調(diào)用遠(yuǎn)程對(duì)象時(shí),實(shí)際調(diào)用的是存根對(duì)象上的方法負(fù)責(zé)初始化并與遠(yuǎn)程對(duì)象所在的遠(yuǎn)程VM連接將參數(shù)打包,傳遞到遠(yuǎn)程VM等待方法調(diào)用的結(jié)果解包返回值和異常將值返回給調(diào)用者存根(stub)框架存在于服務(wù)器接收客戶存根的請(qǐng)求和真正的遠(yuǎn)程對(duì)象進(jìn)行交互傳送服務(wù)器響應(yīng)到客戶負(fù)責(zé)解包客戶端輸入的遠(yuǎn)程方法的參數(shù)調(diào)用實(shí)際的遠(yuǎn)程對(duì)象的方法將結(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簡(jiǎn)單的命名和查找遠(yuǎn)程對(duì)象的服務(wù)遠(yuǎn)程對(duì)象在服務(wù)器端注冊(cè)客戶能夠發(fā)現(xiàn)遠(yuǎn)程對(duì)象和找到遠(yuǎn)程對(duì)象引用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)程對(duì)象接口遠(yuǎn)程對(duì)象實(shí)現(xiàn)服務(wù)程序客戶程序接口和類一個(gè)簡(jiǎn)單的RMI例子1.遠(yuǎn)程對(duì)象的本地接口聲明(RMIOperate.java)該類僅僅是一個(gè)接口聲明,RMI客戶機(jī)可以直接使用它,RMI服務(wù)器必須通過一個(gè)遠(yuǎn)程對(duì)象來實(shí)現(xiàn)它,并用某個(gè)專有的URL注冊(cè)它的一個(gè)實(shí)例。
遠(yuǎn)程接口擴(kuò)展java.rmi.Remote
接口。除了所有應(yīng)用程序特定的例外之外,每個(gè)方法還必須在
throws子句中聲明java.rmi.RemoteException(或RemoteException
的父類)。Hello.javaimport
java.rmi.*;//RMI本地接口必須從Remote接口派生public
interfaceHelloextendsRemote{//接口中的具體方法聲明,注意必須聲明拋出RemoteException
String
sayHello(Stringname)throws
RemoteException;}2、遠(yuǎn)程對(duì)象實(shí)現(xiàn)類
這個(gè)類應(yīng)實(shí)現(xiàn)RMI客戶機(jī)調(diào)用的遠(yuǎn)程服務(wù)對(duì)象的本地接口,它必須從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();}/*實(shí)現(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)程對(duì)象實(shí)現(xiàn)類HelloImpl的一個(gè)實(shí)例,然后通過一個(gè)專有的URL來注冊(cè)它。所謂注冊(cè)就是通過Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,將HelloImpl實(shí)例綁定到指定的URL上。HelloServer.javaimportjava.rmi.*;publicclassHelloServer{publicstaticvoidmain(String[]args){try{
System.out.println("開始RMIServer...");/*創(chuàng)建遠(yuǎn)程對(duì)象的實(shí)現(xiàn)實(shí)例*/
HelloImpl
hImpl=newHelloImpl();
System.out.println("將實(shí)例注冊(cè)到專有的URL");
Naming.rebind("HelloService",hImpl);
System.out.println("等待RMI客戶端調(diào)用...");
System.out.println("");}catch(Exceptione){
System.out.println("錯(cuò)誤:"+e);}}}請(qǐng)注意有關(guān)rebind方法調(diào)用的下列參數(shù):第一個(gè)參數(shù)是URL格式的java.lang.String,表示遠(yuǎn)程對(duì)象的位置和名字。如果URL中省略主機(jī),則主機(jī)缺省值為當(dāng)前主機(jī),而且在URL中無需指定協(xié)議(例如“HelloServer”)。在URL中,可以選擇提供端口號(hào):例如“//myhost:1234/HelloServer”。端口缺省值為1099。除非服務(wù)器在缺省1099端口上創(chuàng)建注冊(cè)服務(wù)程序,否則需要指定端口號(hào)。第二個(gè)參數(shù)為從中調(diào)用遠(yuǎn)程方法的對(duì)象實(shí)現(xiàn)引用。
RMI客戶使用java.rmi.Naming.lookup()方法,在指定的遠(yuǎn)程主機(jī)上查找RMI服務(wù)對(duì)象,若找到就把它轉(zhuǎn)換成本地接口RMIOperate類型。它必須知道提供RMI服務(wù)主機(jī)的URL,這個(gè)URL可以通過rmi://host/path或rmi://host:port/path來指定,如果省略端口號(hào),就默認(rèn)使用1099。
Java.rmi.Naming.lookup()方法可能產(chǎn)生三個(gè)異常:Java.rmi.RemoteException、Java.rmi.NotBoundException、.MalformedURLException,三個(gè)異常都需要捕獲。HelloClient.java/**/importjava.rmi.*;publicclassHelloClient{publicstaticvoidmain(String[]args){/*默認(rèn)為本地主機(jī)和默認(rèn)端口*/Stringhost="localhost:1099";/*帶輸入?yún)?shù)時(shí),將host設(shè)置為指定主機(jī)*/if(args.length>0)host=args[0];t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 攤位餐飲合同分股協(xié)議書
- 2025年防阻燃工作服項(xiàng)目投資可行性研究分析報(bào)告
- 合同甲乙方調(diào)整協(xié)議書
- 吉林云計(jì)算項(xiàng)目商業(yè)計(jì)劃書
- 健康探秘課件教學(xué)
- 個(gè)體臨時(shí)用工合同協(xié)議書
- 社交媒體與網(wǎng)絡(luò)營銷的大學(xué)生甜品店商業(yè)策劃書
- 貨物搬運(yùn)合同協(xié)議書范本
- 酒店會(huì)所合作合同協(xié)議書
- 2025年中國脒基脲項(xiàng)目商業(yè)計(jì)劃書
- 【年產(chǎn)2000噸色氨酸發(fā)酵工廠的計(jì)算與設(shè)計(jì)(附布置圖流程圖)15000字(論文)】
- 2024年倉儲(chǔ)、物流等貨物管理員資格知識(shí)考試題庫(附含答案)
- 提高病人吸氧的依從性品管圈
- DL∕T 1917-2018 電力用戶業(yè)擴(kuò)報(bào)裝技術(shù)規(guī)范
- 邊溝施工技術(shù)交底滑模
- 向最高檢察院提起申訴書范文
- 網(wǎng)孔電流法 (1)講解
- 遼寧省沈陽皇姑區(qū)2023-2024學(xué)年七年級(jí)下學(xué)期期末考試語文試題
- 九宮數(shù)獨(dú)200題(附答案全)
- 江西省宜春市袁州區(qū)2023-2024學(xué)年六年級(jí)下學(xué)期期末考試語文試卷
- A型肉毒素注射美容記錄
評(píng)論
0/150
提交評(píng)論