基于java的網(wǎng)絡(luò)編程_第1頁
基于java的網(wǎng)絡(luò)編程_第2頁
基于java的網(wǎng)絡(luò)編程_第3頁
基于java的網(wǎng)絡(luò)編程_第4頁
基于java的網(wǎng)絡(luò)編程_第5頁
已閱讀5頁,還剩45頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第十章RMI計(jì)算機(jī)學(xué)院網(wǎng)絡(luò)工程,2#410本章關(guān)鍵字分布式計(jì)算是一門計(jì)算機(jī)科學(xué),它研究如何把一個(gè)需要非常巨大的計(jì)算能力才能解決的問題分成許多小的局部,然后把這些局部分配給許多計(jì)算機(jī)進(jìn)行處理,最后把這些計(jì)算結(jié)果綜合起來得到最終的結(jié)果。RMI:面向?qū)ο蟮倪h(yuǎn)程方法調(diào)用(RemoteMethodInvocation)是EnterpriseJavaBeans的支柱,是建立分布式Java應(yīng)用程序的方便途徑。2思考場(chǎng)景計(jì)算PI效勞預(yù)報(bào)天氣情況數(shù)據(jù)調(diào)度資源用戶3程序舉例RMI/Arith.java本地?cái)?shù)據(jù)調(diào)用遠(yuǎn)程的累加資源4第十章RMI10.1RMI概念10.2RMI工作機(jī)制10.3RMI實(shí)現(xiàn)技術(shù)510.1RMI概念分布式計(jì)算是一門計(jì)算機(jī)科學(xué),其實(shí)質(zhì)是“要求運(yùn)行在不同地址空間不同主機(jī)上的對(duì)象互相調(diào)用。〞各種分布式系統(tǒng)都有自己的調(diào)用協(xié)議,CORBA〔CommonObjectRequestBrokerArchitecture,公共對(duì)象請(qǐng)求代理體系結(jié)構(gòu)〕的IIOP(InternetInterORBProtocol,互聯(lián)網(wǎng)內(nèi)部對(duì)象請(qǐng)求代理協(xié)議);MTS〔MicrosoftTransactionServer〕的DCOM〔DistributedComponentObjectModel,分布式組件對(duì)象模型〕。6JAVA中的分布式解決方案在EJB〔EnterpriseJavaBean〕組件的選擇Socket,但它要求客戶端和效勞端必須進(jìn)行應(yīng)用級(jí)協(xié)議的編碼交換數(shù)據(jù);RPC(RemoteProcedureCall),它抽象出了通訊接口用于過程調(diào)用,使得編程者調(diào)用一個(gè)遠(yuǎn)程過程調(diào)用本地過程同樣方便,但RPC并不支持對(duì)象;面向?qū)ο蟮倪h(yuǎn)程調(diào)用RMI(RemoteMethodInvocation),采用它使得調(diào)用遠(yuǎn)程對(duì)象和調(diào)用本地對(duì)象同樣方便。RMI采用JRMP(JavaRemoteMethodProtocol)通訊協(xié)議,是構(gòu)建在TCP/IP協(xié)議上的一種遠(yuǎn)程調(diào)用方法。7什么是RMIRMI是Java的一組開發(fā)分布式應(yīng)用程序的API。RMI使用Java語言接口定義了遠(yuǎn)程對(duì)象,它集合了Java序列化和Java遠(yuǎn)程方法協(xié)議(JavaRemoteMethodProtocol)。通過RMI技術(shù),使原先的程序在同一操作系統(tǒng)的方法調(diào)用,變成了不同操作系統(tǒng)之間程序的方法調(diào)用,由于J2EE是分布式程序平臺(tái),它一RMI機(jī)制實(shí)現(xiàn)程序組件在不同操作系統(tǒng)之間的通信。比方,一個(gè)EJB可以通過RMI調(diào)用Web上另一臺(tái)機(jī)器上的EJB遠(yuǎn)程方法。8RMI調(diào)用例如圖對(duì)象應(yīng)用程序?qū)ο髮?duì)象對(duì)象RMI(提供參數(shù))網(wǎng)絡(luò)本地遠(yuǎn)程返回結(jié)果9強(qiáng)大的RMI技術(shù)RMI〔RemoteMethodInvocation,遠(yuǎn)程方法調(diào)用〕是用Java在JDK1.1中實(shí)現(xiàn)的,它大大增強(qiáng)了Java開發(fā)分布式應(yīng)用的能力。為什么稱Java為網(wǎng)絡(luò)開發(fā)語言,其主要原因就在于〞強(qiáng)大開發(fā)分布式網(wǎng)絡(luò)應(yīng)用“的能力上,而RMI就是開發(fā)百分之百純Java的網(wǎng)絡(luò)分布式應(yīng)用系統(tǒng)的核心解決方案之一。其實(shí),它可以被看作是RPC的Java版本,但是傳統(tǒng)RPC并不能很好地應(yīng)用于分布式對(duì)象系統(tǒng)。而JavaRMI那么支持存儲(chǔ)于不同地址空間的程序級(jí)對(duì)象之間彼此進(jìn)行通信,實(shí)現(xiàn)遠(yuǎn)程對(duì)象之間的無縫遠(yuǎn)程調(diào)用。10真正的跨平臺(tái)操作RMI是以Java為核心的,它將Java的平安性和可移植性等強(qiáng)大功能帶給了分布式計(jì)算,所以可將代理和業(yè)務(wù)邏輯等屬性移動(dòng)到網(wǎng)絡(luò)中最適宜的地方。RMI可利用標(biāo)準(zhǔn)Java本機(jī)方法接口JNI與現(xiàn)有的和原有的系統(tǒng)相連接,RMI還可利用標(biāo)準(zhǔn)JDBC包與關(guān)系數(shù)據(jù)庫連接,RMI/JNI和RMI/JDBC相結(jié)合,可利用RMI與目前使用非Java語言的現(xiàn)有效勞器進(jìn)行通信。RMI為采用Java對(duì)象的分布式計(jì)算提供了簡(jiǎn)單而直接的途徑,通過RMI技術(shù)充分表達(dá)了“編寫一次就能在任何地方運(yùn)行的模式〞。11JAVA的平安性12JAVA的可移植性13RMI的主要優(yōu)點(diǎn):面向?qū)ο螅篟MI可將完整的對(duì)象作為參數(shù)和返回值進(jìn)行傳遞,而不僅僅是預(yù)定義的數(shù)據(jù)類型??梢浦矊傩裕篟MI可將屬性(類實(shí)現(xiàn)程序)從客戶機(jī)移動(dòng)到效勞器,或者從效勞器移到客戶機(jī)。設(shè)計(jì)方式:對(duì)象傳遞功能使您可以在分布式計(jì)算中充分利用面向?qū)ο蠹夹g(shù)的強(qiáng)大功能。14RMI的主要優(yōu)點(diǎn)〔續(xù)〕:安全:RMI使用Java內(nèi)置的平安機(jī)制保證下載執(zhí)行程序時(shí)用戶系統(tǒng)的平安。便于編寫和使用:RMI使得Java遠(yuǎn)程效勞程序和訪問這些效勞程序的Java客戶程序的編寫工作變得輕松、簡(jiǎn)單??蛇B接現(xiàn)有/原有的系統(tǒng):RMI可通過Java的本機(jī)方法接口JNI與現(xiàn)有系統(tǒng)進(jìn)行進(jìn)行交互。RMI可利用JDBC、在不修改使用數(shù)據(jù)庫的現(xiàn)有非Java源代碼的前提下與現(xiàn)有關(guān)系數(shù)據(jù)庫進(jìn)行交互。15RMI的主要優(yōu)點(diǎn)〔續(xù)〕:編寫一次,到處運(yùn)行:RMI是Java“編寫一次,到處運(yùn)行〞方法的一局部。分布式垃圾收集:RMI采用其分布式垃圾收集功能收集不再被網(wǎng)絡(luò)中任何客戶程序所引用的遠(yuǎn)程效勞對(duì)象。并行計(jì)算:RMI采用多線程處理方法,可使您的效勞器利用這些Java線程更好地并行處理客戶端的請(qǐng)求。16RMI標(biāo)準(zhǔn)支持對(duì)存在于不同虛擬機(jī)上對(duì)象的無縫的遠(yuǎn)程調(diào)用支持效勞器對(duì)客戶的回調(diào)把分布式對(duì)象模型自然地集成到Java語言里,盡可能從語義上保存Java的面向?qū)ο蟮奶卣魇狗植际綄?duì)象模型和本地Java對(duì)象模型間的差異明朗使編寫可靠的分布式應(yīng)用程序盡可能簡(jiǎn)單保存Javarun-time環(huán)境索提供的平安性多樣化的遠(yuǎn)程調(diào)用機(jī)制支持多傳輸?shù)哪芰Ψ植际降睦厥?710.2RMI工作機(jī)制RMI應(yīng)用程序通常包括兩個(gè)獨(dú)立的程序:效勞器程序和客戶機(jī)程序。而RMI為效勞器和客戶機(jī)進(jìn)行通信和信息傳遞提供了一種機(jī)制。典型的效勞器應(yīng)用程序?qū)?chuàng)立多個(gè)遠(yuǎn)程對(duì)象,使這些遠(yuǎn)程對(duì)象能夠被引用,然后等待客戶機(jī)調(diào)用這些遠(yuǎn)程對(duì)象的方法。典型的客戶機(jī)程序那么從效勞器中得到一個(gè)或多個(gè)遠(yuǎn)程對(duì)象的引用,然后調(diào)用遠(yuǎn)程對(duì)象的方法。18樁和構(gòu)架在與遠(yuǎn)程對(duì)象的通信過程中,RMI使用標(biāo)準(zhǔn)機(jī)制:樁stub和構(gòu)架skeleton;樁和架構(gòu)是應(yīng)用程序與系統(tǒng)其他局部的接口,通常使用RMI的rmic編譯器產(chǎn)生;樁通常負(fù)責(zé):初始化遠(yuǎn)程調(diào)用、序列化、遠(yuǎn)程方法調(diào)用、反序列化、遠(yuǎn)程方法調(diào)用完成等;構(gòu)架負(fù)責(zé):反序列化客戶端參數(shù)、調(diào)用實(shí)際遠(yuǎn)程對(duì)象、序列化返回客戶端參數(shù)。19樁20RMI系統(tǒng)結(jié)構(gòu)客戶服務(wù)器樁stub構(gòu)架skeleton遠(yuǎn)程引用層傳輸層21RMI系統(tǒng)結(jié)構(gòu)RMI系統(tǒng)由以下組成樁/構(gòu)架層(stub/skeleton):應(yīng)用程序與系統(tǒng)其他局部的接口;遠(yuǎn)程引用層:負(fù)責(zé)獨(dú)立于客戶樁和效勞器構(gòu)架,提供多種形式的遠(yuǎn)程引用和調(diào)用協(xié)議;傳輸層:低級(jí)層,在不同的地址空間內(nèi)傳輸序列化的流。22方法調(diào)用的流向方法調(diào)用從客戶對(duì)象經(jīng)樁程序〔Stub)、遠(yuǎn)程引用層(RemoteReferenceLayer)和傳輸層〔TransportLayer〕向下,傳遞給主機(jī),然后再次經(jīng)傳輸層,向上穿過遠(yuǎn)程調(diào)用層和骨干網(wǎng)〔Skeleton〕,到達(dá)效勞器對(duì)象。23方法調(diào)用的流向〔續(xù)〕樁程序扮演著遠(yuǎn)程效勞器對(duì)象的代理的角色,使該對(duì)象可被客戶激活。遠(yuǎn)程引用層處理語義、管理單一或多重對(duì)象的通信,決定調(diào)用是應(yīng)發(fā)往一個(gè)效勞器還是多個(gè)。傳輸層管理實(shí)際的連接,并且追蹤可以接受方法調(diào)用的遠(yuǎn)程對(duì)象。效勞器端的骨干網(wǎng)完成對(duì)效勞器對(duì)象實(shí)際的方法調(diào)用,并獲取返回值。返回值向下經(jīng)遠(yuǎn)程引用層、效勞器端的傳輸層傳遞回客戶端,再向上經(jīng)傳輸層和遠(yuǎn)程調(diào)用層返回。最后,樁程序獲得返回值。24RMI工作機(jī)制調(diào)用將樁/構(gòu)架層傳遞,他們作為應(yīng)用程序與RMI系統(tǒng)其他局部的一個(gè)接口來提供效勞。它惟一目的是通過序列化流,傳輸數(shù)據(jù)到遠(yuǎn)程引用層;一旦數(shù)據(jù)通過樁/構(gòu)架層傳遞,它將通過遠(yuǎn)程引用層,實(shí)現(xiàn)調(diào)用的予以,并且使用面向連接的流,將數(shù)據(jù)傳遞到傳輸層;數(shù)據(jù)到達(dá)傳輸層,負(fù)責(zé)建立連接并管理這些連接。2510.3RMI實(shí)現(xiàn)技術(shù)利用RMI編寫分布式對(duì)象應(yīng)用程序需要完成以下工作:〔1〕定位遠(yuǎn)程對(duì)象。應(yīng)用程序通常使用簡(jiǎn)單命名工具rmiRegistry來注冊(cè)它的遠(yuǎn)程對(duì)象?!?〕與遠(yuǎn)程對(duì)象通信。遠(yuǎn)程對(duì)象間通信的細(xì)節(jié)由RMI處理,對(duì)于程序員來說,遠(yuǎn)程通信看起來就像標(biāo)準(zhǔn)的Java方法調(diào)用?!?〕給作為參數(shù)或返回值傳遞的對(duì)象加載類字節(jié)碼。26rmi由5個(gè)包和3個(gè)應(yīng)用工具組成java.rmi

客戶端的rmi類,接口和異常

java.rmi.sever

效勞器端的rmi類,接口和異常

java.rmi.registry

用于管理rmi命名效勞的類

java.rmi.dgc

用于管理分布式垃圾收集的類

java.rmi.activation

用于按需緝獲的rmi效勞的類

rmic

編譯器,生成stub和skeleton

rmiregistry

一個(gè)為rmi提供命名效勞的效勞器,這項(xiàng)效勞把名字和對(duì)象關(guān)聯(lián)在一起

rmid

一個(gè)支持rmi激活框架的效勞器

27Java.rmi軟件包RemoteRemoteObjectRemoteServerActivatableUnicastRemoteObjectIOExceptionRemoteExceptionObjectLocateRegisterySecurityManagerNamingRMISecurityManager28Java.rmi.Remote接口29Remote接口該接口是一個(gè)不定義方法的標(biāo)記接口,其全部?jī)?nèi)容只有下面一行

publicinterfaceRemote{}30RMI實(shí)現(xiàn)的步驟遠(yuǎn)程效勞的接口定義;遠(yuǎn)程效勞接口的具體實(shí)現(xiàn);樁〔Stub〕和框架〔Skeleton〕文件;一個(gè)運(yùn)行遠(yuǎn)程效勞的效勞器;一個(gè)RMI命名效勞,它允許客戶端去發(fā)現(xiàn)這個(gè)遠(yuǎn)程效勞;類文件的提供者〔一個(gè)HTTP或者FTP效勞器〕;一個(gè)需要這個(gè)遠(yuǎn)程效勞的客戶端程序。3110.3.2RMI實(shí)現(xiàn)流程1、生成一個(gè)遠(yuǎn)程接口;2、實(shí)現(xiàn)遠(yuǎn)程對(duì)象(效勞器端程序);3、生成樁程序和骨干網(wǎng)(效勞器端程序);4、編寫效勞器程序;5、編寫客戶程序;6、注冊(cè)遠(yuǎn)程對(duì)象;7、啟動(dòng)遠(yuǎn)程對(duì)象。32RMI根底的類設(shè)置在根底的RMI中至少包含三個(gè)類遠(yuǎn)程接口效勞端程序客戶端程序例如:RMI/arith.java33定義遠(yuǎn)程接口遠(yuǎn)程接口定義說明了效勞器提供的方法特性,包含了方法的名字和參數(shù)。這樣的接口必備的特性必須聲明為public必須extendsjava.rmi.Remote接口異常處理時(shí),必須throwsjava.rmi.RemoteException34實(shí)現(xiàn)遠(yuǎn)程接口必要步驟指定要執(zhí)行的遠(yuǎn)程接口定義遠(yuǎn)程對(duì)象的成員屬性實(shí)現(xiàn)能被遠(yuǎn)程調(diào)用的方法創(chuàng)立一個(gè)平安管理器RMISecurityManager對(duì)象實(shí)例創(chuàng)立遠(yuǎn)程對(duì)象的對(duì)象實(shí)例注冊(cè)rebind或bind遠(yuǎn)程對(duì)象到RMI注冊(cè)表中35開發(fā)客戶端程序建立遠(yuǎn)程對(duì)象實(shí)例對(duì)象;在制定的RMI注冊(cè)表查找相應(yīng)的遠(yuǎn)程效勞;傳遞參數(shù)及調(diào)用相關(guān)遠(yuǎn)程方法;等待結(jié)果及輸出結(jié)果。3610.3.3RMI在Windows下運(yùn)行步驟一共分為5步1.進(jìn)入命令行窗口,進(jìn)入自己工程的文件夾內(nèi)使用javac*.java2.使用rmicserverName這時(shí)會(huì)產(chǎn)生一個(gè)serverName_Stub.class的文件3.使用startrmiregistry4.輸入java-Djava.security.policy=policyNameserverName運(yùn)行效勞器5.如果成功另外翻開一個(gè)命令行窗口進(jìn)入自己工程文件夾輸入java-Djava.security.policy=policyNameclientName〔注意,有的時(shí)候要在后面加上參數(shù)localhost〕37產(chǎn)生樁和框架樁和框架是是在效勞器端在運(yùn)行時(shí)確定,根據(jù)需要?jiǎng)討B(tài)裝載,采用rmic編譯器生成stub和skeleton。例如 rmicrmiExampl在JDK1.5下,該命令執(zhí)行后將生成一個(gè)樁文件,文件名為:rmiExampl_Stub.class

38啟動(dòng)RMI注冊(cè)表RMI注冊(cè)表是一個(gè)名字效勞,允許客戶程序獲得對(duì)遠(yuǎn)程對(duì)象的引用,在效勞器/客戶程序之前,必須啟動(dòng)RMI注冊(cè)表。在Windows環(huán)境下,啟動(dòng)方式為 startrmiregistry 默認(rèn)情況下,啟動(dòng)的端口為1099。如果要改變端口那么使用 startrmiregistry300039執(zhí)行RMI效勞器和客戶機(jī)首先,執(zhí)行效勞器端程序JavarmiServer然后,執(zhí)行客戶端程序JavarmiClient40程序舉例RMI/獲得遠(yuǎn)程時(shí)間41在執(zhí)行效勞器端程序時(shí)的異常執(zhí)行javarmiServer出現(xiàn)異常java.security.AccessControlException:accessdenied(.SocketPermission:3000connect,resolve)被本地的策略文件所限制4210.3.4什么是策略文件一個(gè)文本文件,里面記錄了一些對(duì)計(jì)算機(jī)資源訪問的方式;比方對(duì)本地文件的訪問控制,對(duì)端口的訪問控制等。其文件后綴名為〞*.policy〞系統(tǒng)策略文件的缺省位置為: java.home/lib/security/java.policy(Solaris)java.home\lib\security\java.policy(Windows)43根本的授權(quán)設(shè)置GrantcodeBase“路徑"{ permissionjava.io.FilePermission "C:\\users\\cathy\\foo.bat","read"; permission.SocketPermission "*:1024-65535","connect,accept"; permission

java.security.AllPermission;};44最簡(jiǎn)單的解決方案翻開你的jdk目錄下的這個(gè)文件C:\ProgramFiles\Java\jdk1.5.0_04\jre\lib\security\java.policy在文件最后參加下面代碼:grant{

permission.SocketPermission"*:1024-65535","connect,accept";

permission.SocketPermission"*:80","connect";};45最常用的解決方案建立自己的策略文件,如c:\MyPolicy.policy,內(nèi)容為:grant{

permission.SocketPermission"localhost:2005","connect,resolve";}執(zhí)行時(shí)用命令,指定了平安策略文件java-Djava.security.policy=c:\MyPolicy.policyrmiServer46其它2種解決方案1)設(shè)置平安管理器System.setSecurityManager(newRMISecurityManager());,2)把System.setSecurityManager(newRMISecurityManager())改為匿名類實(shí)現(xiàn),覆蓋兩個(gè)方法System.setSecurityM

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論