分布式計(jì)算、云計(jì)算與大數(shù)據(jù) 第2版 課件匯 第1-5章 分布式計(jì)算概論 - 云計(jì)算編程實(shí)踐_第1頁(yè)
分布式計(jì)算、云計(jì)算與大數(shù)據(jù) 第2版 課件匯 第1-5章 分布式計(jì)算概論 - 云計(jì)算編程實(shí)踐_第2頁(yè)
分布式計(jì)算、云計(jì)算與大數(shù)據(jù) 第2版 課件匯 第1-5章 分布式計(jì)算概論 - 云計(jì)算編程實(shí)踐_第3頁(yè)
分布式計(jì)算、云計(jì)算與大數(shù)據(jù) 第2版 課件匯 第1-5章 分布式計(jì)算概論 - 云計(jì)算編程實(shí)踐_第4頁(yè)
分布式計(jì)算、云計(jì)算與大數(shù)據(jù) 第2版 課件匯 第1-5章 分布式計(jì)算概論 - 云計(jì)算編程實(shí)踐_第5頁(yè)
已閱讀5頁(yè),還剩413頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第1章分布式計(jì)算概論提綱1.1 分布式計(jì)算概念1.2 分布式計(jì)算模式1.3 分布式基礎(chǔ)問題與理論1.4 經(jīng)典分布式(計(jì)算)系統(tǒng)分布式計(jì)算的定義分布式計(jì)算是一門計(jì)算機(jī)科學(xué),主要研究對(duì)象是分布式系統(tǒng)。在介紹分布式計(jì)算概念前,首先簡(jiǎn)單了解一下什么是分布式系統(tǒng)。簡(jiǎn)單地說,一個(gè)分布式系統(tǒng)是由若干通過網(wǎng)絡(luò)互聯(lián)的計(jì)算機(jī)組成的軟硬件系統(tǒng)[1],且這些計(jì)算機(jī)互相配合以完成一個(gè)共同的目標(biāo)(往往這個(gè)共同的目標(biāo)稱為“項(xiàng)目”)分布式計(jì)算指在分布式系統(tǒng)上執(zhí)行的計(jì)算。分布式計(jì)算是將一個(gè)大型計(jì)算任務(wù)分成很多部分分別交給其他的計(jì)算機(jī)處理,并將所有的計(jì)算結(jié)果合并為原問題的解決方案。這里與并行計(jì)算不同的是,并行計(jì)算是使用多個(gè)處理器并行執(zhí)行單個(gè)計(jì)算。分布式計(jì)算的優(yōu)缺點(diǎn)優(yōu)點(diǎn)

高可伸縮性

資源共享

高性價(jià)比

容錯(cuò)性

超大規(guī)模

通用性弱點(diǎn)

多點(diǎn)故障一臺(tái)或多臺(tái)計(jì)算機(jī)的故障,或一條或多條網(wǎng)絡(luò)鏈路的故障,都會(huì)導(dǎo)致分布式系統(tǒng)出現(xiàn)問題

安全性低分布式系統(tǒng)為非授權(quán)用戶的攻擊提供了更多機(jī)會(huì)

大規(guī)模資源調(diào)度的復(fù)雜性資源調(diào)度通常是一個(gè)NP-hard問題,大規(guī)模資源調(diào)度往往具有很高的復(fù)雜性和不確定性提綱1.1 分布式計(jì)算概念1.2 分布式計(jì)算模式1.3 分布式基礎(chǔ)問題與理論1.4 經(jīng)典分布式(計(jì)算)系統(tǒng)分布式云計(jì)算相關(guān)計(jì)算形式分布式云計(jì)算相關(guān)計(jì)算形式分布式云計(jì)算相關(guān)計(jì)算形式當(dāng)前最熱門計(jì)算機(jī)技術(shù)對(duì)比分布式云計(jì)算相關(guān)計(jì)算形式當(dāng)前最熱門計(jì)算機(jī)技術(shù)對(duì)比集中計(jì)算與分布式計(jì)算串行運(yùn)算與并行運(yùn)算并行運(yùn)算與分布式計(jì)算的區(qū)別:分布式計(jì)算強(qiáng)調(diào)的是任務(wù)的分布執(zhí)行,而并行計(jì)算強(qiáng)調(diào)的是任務(wù)的并發(fā)執(zhí)行云計(jì)算概念提出提出者:Google工程師,比希利亞,27歲出發(fā)點(diǎn):推廣Google超級(jí)強(qiáng)大的計(jì)算資源,招賢納士結(jié)果:蜂擁而至,名噪一時(shí),被視為“云”的起源*-12-云計(jì)算分類私有云公有云混合云操作系統(tǒng)+應(yīng)用服務(wù)引擎應(yīng)用系統(tǒng)基礎(chǔ)設(shè)施(IaaS)應(yīng)用平臺(tái)(PaaS)應(yīng)用軟件(SaaS)InfrastructureasaService以服務(wù)的形式提供虛擬硬件資源,如虛擬主機(jī)/存儲(chǔ)/網(wǎng)絡(luò)/數(shù)據(jù)庫(kù)管理等資源。用于無(wú)需購(gòu)買服務(wù)器、網(wǎng)絡(luò)設(shè)備、存儲(chǔ)設(shè)備,只需通過互聯(lián)網(wǎng)租賃即可搭建自己的應(yīng)用系統(tǒng)典型應(yīng)用:AmazonWeb

Service(AWS)PlatformasaService提供應(yīng)用服務(wù)引擎,如互聯(lián)網(wǎng)應(yīng)用編程接口/運(yùn)行平臺(tái)等。用戶基于該應(yīng)用服務(wù)引擎,可以構(gòu)建該類應(yīng)用。典型應(yīng)用:GoogleAppEngine,F,MicrosoftAzure服務(wù)平臺(tái)SoftwareasaService用戶通過Internet(如瀏覽器)來(lái)使用軟件。用戶不必購(gòu)買軟件,只需按需租用軟件典型應(yīng)用:GoogleDoc,S,OracleCRMOnDemand,OfficeLiveWorkspace面向外部用戶需求,通過開放網(wǎng)絡(luò)提供云計(jì)算服務(wù)IDC,GoogleApp,Saleforce在線CRM按提供的服務(wù)類型按云服務(wù)的對(duì)象大型企業(yè)按照云計(jì)算的架構(gòu)搭建平臺(tái),面向企業(yè)內(nèi)部需求提供云計(jì)算服務(wù)企業(yè)內(nèi)部數(shù)據(jù)中心等兼顧以上兩種情況的云計(jì)算服務(wù)AmazonWebServer等既為企業(yè)內(nèi)部又為外部用戶提供云計(jì)算服務(wù)云計(jì)算與網(wǎng)格計(jì)算網(wǎng)格計(jì)算:利用互聯(lián)網(wǎng)把地理上廣泛分布的各種資源(計(jì)算、存儲(chǔ)、帶寬、軟件、數(shù)據(jù)、信息、知識(shí)等)連成一個(gè)邏輯整體,就像一臺(tái)超級(jí)計(jì)算機(jī)一樣,為用戶提供一體化信息和應(yīng)用服務(wù)(計(jì)算、存儲(chǔ)、訪問等)。網(wǎng)格計(jì)算強(qiáng)調(diào)資源共享,任何節(jié)點(diǎn)都可以請(qǐng)求使用其它節(jié)點(diǎn)的資源,任何節(jié)點(diǎn)都需要貢獻(xiàn)一定資源給其他節(jié)點(diǎn)。云計(jì)算強(qiáng)調(diào)專有,請(qǐng)求或獲取的資源是專有的,并且由少數(shù)團(tuán)體提供,使用者不需要貢獻(xiàn)自己的資源。網(wǎng)格計(jì)算側(cè)重并行的計(jì)算集中性需求,并且難以自動(dòng)擴(kuò)展。云計(jì)算側(cè)重事務(wù)性應(yīng)用,大量的單獨(dú)的請(qǐng)求,可以實(shí)現(xiàn)自動(dòng)或半自動(dòng)的擴(kuò)展。云計(jì)算包含的網(wǎng)格計(jì)算特征:(1)提供在線的計(jì)算、存儲(chǔ)等服務(wù)(2)超大規(guī)模的資源組合(3)資源的虛擬化*14云計(jì)算與分布式計(jì)算分布式計(jì)算(狹義):將待解決問題分成多個(gè)小問題,再分配給許多計(jì)算系統(tǒng)處理,最后將處理結(jié)果加以綜合。特點(diǎn):把計(jì)算任務(wù)分派給網(wǎng)絡(luò)中的多臺(tái)獨(dú)立的機(jī)器優(yōu)點(diǎn)稀有資源可以共享通過分布式計(jì)算可以在多臺(tái)計(jì)算機(jī)上平衡計(jì)算負(fù)載可以把程序放在最適合運(yùn)行它的計(jì)算機(jī)上流行的分布式項(xiàng)目SETI@Home:尋找外星文明RC-72:密碼分析破解,研究和尋找最為安全的密碼系統(tǒng)Folding@home:研究蛋白質(zhì)折疊、聚合問題UnitedDevices:尋找對(duì)抗癌癥的有效的藥物GIMPS:尋找最大的梅森素?cái)?shù)(解決較為復(fù)雜的數(shù)學(xué)問題)云計(jì)算包含的分布式計(jì)算特征:1)通過資源調(diào)度和組合滿足用戶的資源請(qǐng)求;2)對(duì)外提供統(tǒng)一的、單一的接口云計(jì)算是分布式計(jì)算的發(fā)展,是分布式計(jì)算的一種新形式。分布式郵箱系統(tǒng)15云計(jì)算與并行計(jì)算并行計(jì)算:是相對(duì)于串行計(jì)算的概念,最早出現(xiàn)于上個(gè)世紀(jì)六七十年代,指在并行計(jì)算機(jī)上所做的計(jì)算?,F(xiàn)通常指同時(shí)使用多種計(jì)算資源解決計(jì)算問題的過程,即一個(gè)程序的多個(gè)部分同時(shí)運(yùn)行于多個(gè)處理器上。分類:可分為時(shí)間上的并行(流水線)和空間上的并行(多處理器并發(fā))并行計(jì)算問題的特征將工作分離成離散部分,有助于同時(shí)解決隨時(shí)并及時(shí)地執(zhí)行多個(gè)程序指令(多條線同時(shí)運(yùn)行)多計(jì)算資源下解決問題的耗時(shí)要少于單個(gè)計(jì)算資源下的耗時(shí)云計(jì)算包含的并行計(jì)算特征:用戶資源(單一類型和組合類型)請(qǐng)求的同時(shí)處理*16云計(jì)算與對(duì)等計(jì)算對(duì)等計(jì)算系統(tǒng)中,每個(gè)節(jié)點(diǎn)都擁有對(duì)等的功能與責(zé)任,既可以充當(dāng)服務(wù)器向其他節(jié)點(diǎn)提供數(shù)據(jù)或服務(wù),又可以作為客戶機(jī)享用其他節(jié)點(diǎn)提的供數(shù)據(jù)或服務(wù),節(jié)點(diǎn)之間的交互可以是直接對(duì)等的,任何節(jié)點(diǎn)可以隨時(shí)自由地加入或離開系統(tǒng)。對(duì)等計(jì)算:有可能作為云計(jì)算的一個(gè)類型預(yù)測(cè):將可能以“對(duì)等子云”的形式出現(xiàn)在云計(jì)算中。依據(jù):云計(jì)算對(duì)超大規(guī)模、多類型資源的統(tǒng)一管理是困難的;對(duì)等計(jì)算具有魯棒性、可擴(kuò)展性、成本、搜索等方面的優(yōu)點(diǎn)Google的云計(jì)算服務(wù)曾出現(xiàn)嚴(yán)重問題,Gmail、Blogger和Spreadsheet等服務(wù)均長(zhǎng)時(shí)間當(dāng)機(jī)。亞馬遜S3云計(jì)算服務(wù)也曾出現(xiàn)問題。而P2P系統(tǒng)則有更強(qiáng)的抗毀能力。*17霧計(jì)算基本概念霧計(jì)算是個(gè)很形象的名稱,提出它的GinnyNichols提了一個(gè)有趣的說法“霧是接近地面的云”。這句話有兩層含義:1)霧計(jì)算和云計(jì)算有很多相似。例如:它們都基于虛擬化技術(shù),從共享的資源池中為多用戶提供資源。2)“接近地面”。這也指出了霧和云的一個(gè)不同——網(wǎng)絡(luò)拓?fù)渲械奈恢?。霧的概念:霧節(jié)點(diǎn)所使用的設(shè)備:

霧主要使用邊緣網(wǎng)絡(luò)中的設(shè)備。這些設(shè)備可以是傳統(tǒng)網(wǎng)絡(luò)設(shè)備(早已部署在網(wǎng)絡(luò)中的路由器,交換機(jī),網(wǎng)關(guān)等等),也可以是專門部署的本地服務(wù)器。霧計(jì)算基本原理霧計(jì)算概念示意圖霧計(jì)算實(shí)例智能交通燈系統(tǒng)霧計(jì)算的引入將為智能交通燈系統(tǒng)帶來(lái)更多的可能性。如:監(jiān)控過程中,相鄰幀間畫面只有部分變化,非常適于在霧節(jié)點(diǎn)處緩存若干幀畫面,壓縮后再傳向中心機(jī)房,這樣從霧節(jié)點(diǎn)到機(jī)房的網(wǎng)絡(luò)帶寬將得到很大緩解。在霧節(jié)點(diǎn)處,可判斷監(jiān)控畫面中是否有救護(hù)車頭燈閃爍,做出實(shí)時(shí)決策發(fā)送給對(duì)應(yīng)交通燈,協(xié)助救護(hù)車通過。

邊緣計(jì)算基本概念邊緣計(jì)算(EdgeComputing)指的是接近于事物,數(shù)據(jù)和行動(dòng)源頭處的計(jì)算也被稱為:鄰近計(jì)算或者接近計(jì)算(ProximityComputing)邊緣計(jì)算的概念:邊緣網(wǎng)絡(luò):

邊緣計(jì)算讓數(shù)據(jù)在邊緣網(wǎng)絡(luò)處處理。邊緣網(wǎng)絡(luò)基本上由終端設(shè)備(例如移動(dòng)手機(jī)、智能物品等等)、邊緣設(shè)備(例如邊界路由器、機(jī)頂盒、網(wǎng)橋、基站、無(wú)線接入點(diǎn)等等)、邊緣服務(wù)器等構(gòu)成。邊緣計(jì)算基本原理云計(jì)算、霧計(jì)算、邊緣計(jì)算關(guān)系:霧計(jì)算也可以進(jìn)行邊緣計(jì)算。除了邊緣網(wǎng)絡(luò),霧計(jì)算也可以拓展到核心網(wǎng)絡(luò)。邊緣和核心網(wǎng)絡(luò)(例如核心路由器、區(qū)域服務(wù)器、廣域網(wǎng)路開關(guān)等等)的組件都可以作為霧計(jì)算基礎(chǔ)設(shè)施。邊緣計(jì)算依賴于不構(gòu)成網(wǎng)絡(luò)的單獨(dú)節(jié)點(diǎn),需要通過云實(shí)現(xiàn)孤島中節(jié)點(diǎn)的對(duì)等流量傳輸。霧計(jì)算用幾個(gè)層次形成網(wǎng)絡(luò),節(jié)點(diǎn)之間具有廣泛的對(duì)等互連能力。霧計(jì)算以及邊緣計(jì)算都不是用來(lái)代替云計(jì)算,它們共同形成一個(gè)彼此受益的計(jì)算模型。邊緣計(jì)算實(shí)例智能交通燈系統(tǒng)無(wú)人駕駛汽車走向規(guī)?;瘧?yīng)用必須存儲(chǔ)和運(yùn)算海量的數(shù)據(jù)。無(wú)人駕駛汽車要在高速行駛過程中,通過無(wú)線網(wǎng)絡(luò)與云端進(jìn)行大量超低時(shí)延、超大流量的數(shù)據(jù)交互,現(xiàn)有網(wǎng)絡(luò)根本沒有能力支撐。依靠移動(dòng)邊緣計(jì)算,數(shù)據(jù)可以就近存儲(chǔ)于車輛附近位置甚至車身上。在車輛高速度運(yùn)動(dòng)過程中,位置信息變化十分迅速,被置于車身上的最末端的移動(dòng)邊緣計(jì)算服務(wù)器能夠精確地實(shí)時(shí)感知車輛位置的變動(dòng),并將分析所得結(jié)果以極低延遲(通常是毫秒級(jí))傳送給臨近區(qū)域內(nèi)其他聯(lián)網(wǎng)車輛,以便車輛做出決策。

移動(dòng)邊緣計(jì)算移動(dòng)邊緣計(jì)算就是利用無(wú)線接入網(wǎng)絡(luò)就近提供電信用戶IT所需服務(wù)和云端計(jì)算功能,而創(chuàng)造出一個(gè)具備高性能、低延遲與高帶寬的電信級(jí)服務(wù)環(huán)境,加速網(wǎng)絡(luò)中各項(xiàng)內(nèi)容、服務(wù)及應(yīng)用的快速下載,讓消費(fèi)者享有不間斷的高質(zhì)量網(wǎng)絡(luò)體驗(yàn)。移動(dòng)邊緣計(jì)算把無(wú)線網(wǎng)絡(luò)和互聯(lián)網(wǎng)兩者技術(shù)有效融合在一起。移動(dòng)云計(jì)算移動(dòng)云計(jì)算是指通過移動(dòng)網(wǎng)絡(luò)以按需、易擴(kuò)展的方式獲得所需的基礎(chǔ)設(shè)施、平臺(tái)、軟件(或應(yīng)用)等的一種IT資源或(信息)服務(wù)的交付與使用模式。如圖所示,移動(dòng)云計(jì)算是云計(jì)算技術(shù)在移動(dòng)互聯(lián)網(wǎng)中的應(yīng)用,本質(zhì)上就是基于移動(dòng)終端獲取各種云端服務(wù)的技術(shù)。大數(shù)據(jù)計(jì)算概念隨著互聯(lián)網(wǎng)與計(jì)算機(jī)系統(tǒng)需要處理的數(shù)量越來(lái)越大,大數(shù)據(jù)計(jì)算成為一種非常重要的數(shù)據(jù)分析處理模式。大數(shù)據(jù)計(jì)算一般是指利用分布式計(jì)算技術(shù)對(duì)海量數(shù)據(jù)進(jìn)行在線或離線的實(shí)時(shí)性或批處理分析計(jì)算。當(dāng)前大數(shù)據(jù)計(jì)算的主要模式有:基于MapReduce的批處理計(jì)算、流式計(jì)算、基于Spark的內(nèi)存計(jì)算?;贛apReduce的批處理計(jì)算InputsplitshuffleoutputMapReduce計(jì)算模式的主要思想是將自動(dòng)分割要執(zhí)行的問題(例如程序)拆解成Map和Reduce兩個(gè)函數(shù)操作,然后對(duì)分塊的大數(shù)據(jù)采用“分而治之”的并行處理方式分析計(jì)算數(shù)據(jù)。大數(shù)據(jù)流式計(jì)算大數(shù)據(jù)批處理計(jì)算關(guān)注數(shù)據(jù)處理的吞吐量,而大數(shù)據(jù)流式計(jì)算更關(guān)注數(shù)據(jù)處理的實(shí)時(shí)性。流式計(jì)算具有很強(qiáng)的實(shí)時(shí)性,需要對(duì)應(yīng)用源源不斷產(chǎn)生的數(shù)據(jù)實(shí)時(shí)進(jìn)行處理,使數(shù)據(jù)不積壓、不丟失,常用于處理電信、電力等行業(yè)應(yīng)用以及互聯(lián)網(wǎng)行業(yè)的訪問日志等?;赟park的內(nèi)存計(jì)算由于MapReduce計(jì)算過程中需要讀寫HDFS存儲(chǔ)(訪問磁盤IO),而在Spark內(nèi)存計(jì)算過程中,使用內(nèi)存替代了使用HDFS存儲(chǔ)中間結(jié)果,即在進(jìn)行大數(shù)據(jù)分析處理時(shí)使用分布式內(nèi)存計(jì)算,內(nèi)存訪問要比磁盤快得多。因此,基于Spark的內(nèi)存計(jì)算的數(shù)據(jù)處理性能會(huì)提升很多,特別是針對(duì)需要多次迭代大數(shù)據(jù)計(jì)算的應(yīng)用。無(wú)服務(wù)器計(jì)算無(wú)服務(wù)器計(jì)算來(lái)自英文ServerlessComputing的翻譯,簡(jiǎn)稱為Serverless,它并不是指沒有服務(wù)器,而是說,對(duì)于用戶,服務(wù)器變得“不可見”了(或者說“無(wú)感知”),是指開發(fā)者不需要直接管理服務(wù)器資源。Serverless是一種云計(jì)算模型,它允許開發(fā)者編寫和部署功能單元(函數(shù))而無(wú)需關(guān)心底層的服務(wù)器基礎(chǔ)設(shè)施。在Serverless架構(gòu)中,云服務(wù)提供商負(fù)責(zé)動(dòng)態(tài)管理和分配服務(wù)器資源,根據(jù)實(shí)際需要為函數(shù)執(zhí)行提供計(jì)算資源。Serverless的核心目的,就是在云計(jì)算的基礎(chǔ)上,再向前邁進(jìn)一步,徹底“包攬”所有的環(huán)境工作,直接提供計(jì)算服務(wù)。在Serverless架構(gòu)下,開發(fā)者只需編寫代碼并上傳,云平臺(tái)就會(huì)自動(dòng)準(zhǔn)備好相應(yīng)的計(jì)算資源,完成運(yùn)算并輸出結(jié)果,從而大幅簡(jiǎn)化開發(fā)運(yùn)維過程。也就說,Serverless是云計(jì)算的進(jìn)一步延伸,所以,它繼承了云計(jì)算的最大特點(diǎn)——按需彈性伸縮、按需付費(fèi)。無(wú)服務(wù)器計(jì)算從層級(jí)上來(lái)看,Serverless在傳統(tǒng)云計(jì)算SaaS的Application(應(yīng)用)層級(jí)之上,又加了一層——function(函數(shù)),如圖所示。它的顆粒度更細(xì),可以更靈活地滿足用戶的算力需求。按照CNCF對(duì)Serverless的定義,Serverless架構(gòu)是采用FaaS(函數(shù)即服務(wù))和BaaS(后端服務(wù))服務(wù)來(lái)解決問題的一種設(shè)計(jì)。即Serverless=FaaS+BaaS。FaaS就是Functionasaservice(函數(shù)即服務(wù))。每一個(gè)函數(shù)都是一個(gè)服務(wù),函數(shù)可以由任何語(yǔ)言編寫,直接托管在云平臺(tái),以服務(wù)形式運(yùn)行,通過事件觸發(fā)。提綱1.1 分布式計(jì)算概念1.2 分布式計(jì)算模式1.3 分布式基礎(chǔ)問題與理論1.4 經(jīng)典分布式(計(jì)算)系統(tǒng)2000年7月,來(lái)自加州大學(xué)伯克利分校EricBrewer教授首次提出了著名的CAP猜想。2年后,來(lái)自麻省理工學(xué)院的SethGilbert和NancyLynch從理論上證明了Brewer教授CAP猜想。從此,CAP理論正式在學(xué)術(shù)上成為了分布式計(jì)算領(lǐng)域的公認(rèn)定理,并深深地影響了分布式計(jì)算的發(fā)展。分布式系統(tǒng)的CAP理論:對(duì)于一個(gè)分布式計(jì)算系統(tǒng)來(lái)說,不可能同時(shí)滿足以下三點(diǎn):一致性(C)、可用性(A)、分區(qū)容忍性(P)。一致性(C):即Consistency,所有節(jié)點(diǎn)訪問同一份最新的數(shù)據(jù)副本。在分布式系統(tǒng)中的所有數(shù)據(jù)備份,在同一時(shí)刻是否同樣的值??捎眯裕ˋ):即Availability,對(duì)數(shù)據(jù)更新具備高可用性。在集群中一部分節(jié)點(diǎn)故障后,集群整體還能響應(yīng)客戶端的讀寫請(qǐng)求。。分區(qū)容錯(cuò)性(P):即Partitiontolerance,當(dāng)分布式系統(tǒng)集群中的某些結(jié)點(diǎn)無(wú)法聯(lián)系時(shí)仍能正常提供服務(wù)。*33分布式系統(tǒng)的CAP定理CAP理論一個(gè)說明CAP理論的分布式應(yīng)用例子1)正常情況:服務(wù)器N1和N2分別寫、讀數(shù)據(jù),且服務(wù)器N1和N2通過同步消息來(lái)實(shí)現(xiàn)數(shù)據(jù)讀寫的一致性。2)當(dāng)服務(wù)器N1和N2之間的通信異常中斷時(shí):則系統(tǒng)(服務(wù)器N2)要么只能讀取舊數(shù)據(jù),犧牲一致性;要么服務(wù)器N1的寫操作就會(huì)隨著數(shù)據(jù)更新消息發(fā)送失敗而回滾,系統(tǒng)無(wú)法使用,違背了可用性。提綱1.1 分布式計(jì)算概念1.2 分布式計(jì)算模式1.3 分布式基礎(chǔ)問題與理論1.4 經(jīng)典分布式(計(jì)算)系統(tǒng)分布式系統(tǒng)介紹分布式系統(tǒng):指通過網(wǎng)絡(luò)互連,可協(xié)作執(zhí)行某個(gè)任務(wù)的獨(dú)立計(jì)算機(jī)集合。分布式系統(tǒng)介紹WWW(WorldWideWeb)是全球最大的分布式系統(tǒng),互聯(lián)網(wǎng)服務(wù)之一統(tǒng)一資源標(biāo)識(shí)符(URI)資源定位器(URL)超文本傳輸協(xié)議(HTML)客戶機(jī)/服務(wù)器(Client/Server)模式分布式系統(tǒng)介紹SETI@home(尋找外星人)搜尋證實(shí)地球外智能生物存在的證據(jù)志愿參加人數(shù)最多的分布式項(xiàng)目(Project)屏幕保護(hù)模式下的后臺(tái)運(yùn)行(客戶端計(jì)算為主)1999-2005543萬(wàn)用戶、243萬(wàn)年累計(jì)計(jì)算沒有發(fā)現(xiàn)外星文明直接證據(jù)分布式系統(tǒng)介紹BOINC項(xiàng)目(BerkeleyOpenInfrastructureforNetworkComputing)傳統(tǒng)客戶端/服務(wù)器架構(gòu)服務(wù)器端配置:數(shù)據(jù)庫(kù)服務(wù)器、數(shù)據(jù)處理服務(wù)器、資源任務(wù)調(diào)配服務(wù)器、Web服務(wù)器等子系統(tǒng)組成客戶端設(shè)置志愿計(jì)算功能服務(wù)器(軟件)用于:數(shù)學(xué)、物理、化學(xué)、生物科學(xué)、地理科學(xué)等項(xiàng)目計(jì)算最為流行的分布式計(jì)算平臺(tái)分布式系統(tǒng)介紹分布式系統(tǒng)介紹OpenStackOpenStack是一個(gè)開源的云計(jì)算管理平臺(tái)項(xiàng)目目標(biāo)是提供實(shí)施簡(jiǎn)單、可大規(guī)模擴(kuò)展、豐富、標(biāo)準(zhǔn)統(tǒng)一的云計(jì)算管理平臺(tái)由一系列具有RESTful接口的Web服務(wù)所實(shí)現(xiàn)的,是一系列組件服務(wù)集合OpenStack本身是一個(gè)分布式系統(tǒng),不但各個(gè)服務(wù)可以分布部署,服務(wù)中的組件也可以分布部署OpenStack包含了許多組件服務(wù)Nova:提供計(jì)算服務(wù);Keystone:提供認(rèn)證服務(wù);Glance:提供鏡像服務(wù);Neutron:提供網(wǎng)絡(luò)服務(wù);Horizon:提供儀表盤服務(wù);Swift:提供對(duì)象存儲(chǔ)服務(wù);Cinder:提供塊存儲(chǔ)服務(wù);Heat:提供編排服務(wù);Ceilometer:提供計(jì)費(fèi)和監(jiān)控服務(wù);Trove:提供數(shù)據(jù)庫(kù)服務(wù);Sahara:提供數(shù)據(jù)處理服務(wù)分布式系統(tǒng)介紹OpenStackOpenStack的總體架構(gòu)分布式系統(tǒng)介紹HadoopHadoop是一個(gè)由Apache基金會(huì)所開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu)。起源于開源網(wǎng)絡(luò)搜索引擎ApacheNutch,基于谷歌分布式文件系統(tǒng)“GFS”和分布式數(shù)據(jù)處理系統(tǒng)“MapReduce”兩篇論文實(shí)現(xiàn)的開源版本包括核心的分布式文件存儲(chǔ)系統(tǒng)HDFS和分布式計(jì)算框架MapReduce,以及用于集群資源管理的YARN分布式系統(tǒng)介紹HadoopHDFS集群按照管理節(jié)點(diǎn)-工作節(jié)點(diǎn)模式運(yùn)行,其中NameNode為管理節(jié)點(diǎn),DataNode為工作節(jié)點(diǎn),SecondaryNameNode是輔助namenode分布式系統(tǒng)介紹HadoopHBase是一個(gè)在HDFS上開發(fā)的面向列的分布式數(shù)據(jù)庫(kù),服務(wù)依賴于Zookeeper,用一個(gè)Master節(jié)點(diǎn)協(xié)調(diào)管理一個(gè)或多個(gè)Regionserver從屬機(jī)分布式系統(tǒng)介紹HadoopYARN是Hadoop的集群資源管理系統(tǒng),ResourceManager是一個(gè)全局的資源管理器ApplicationMaster是應(yīng)用程序級(jí)別的管理器NodeManager是YARN中每個(gè)節(jié)點(diǎn)上的代理管理器分布式系統(tǒng)介紹Spark一種基于內(nèi)存的快速、通用、可擴(kuò)展的大數(shù)據(jù)分析計(jì)算引擎,相對(duì)于MapReduce的批處理計(jì)算,Spark可以帶來(lái)上百倍的性能提升其核心是建立在統(tǒng)一的抽象彈性分布式數(shù)據(jù)集(ResilienntDistributedDatasets,RDD)之上的,RDD允許開發(fā)人員在大型集群上執(zhí)行基于內(nèi)存的計(jì)算,同時(shí)屏蔽了Spark底層對(duì)數(shù)據(jù)的復(fù)雜抽象和處理Spark軟件棧包含四大組件:SparkSQL:SparkSQL是Spark中用于處理結(jié)構(gòu)化數(shù)據(jù)的組件;SparkStreaming:SparkStreaming是Spark提供用于處理實(shí)時(shí)的流數(shù)據(jù)的組件;MLlib:MLlib是Spark中集成了常見的機(jī)器學(xué)習(xí)模型的組件GraphX:GraphX是Spark提供圖計(jì)算和并行圖計(jì)算功能的組件。分布式系統(tǒng)介紹Spark作為一個(gè)開源集群運(yùn)算框架,Spark共支持四種集群運(yùn)行模式:Standalone模式,基于ApahceMesos,基于HadoopYARN以及基于Kubernetes。ClusterManager:控制整個(gè)集群,監(jiān)控worker;Worker節(jié)點(diǎn):從節(jié)點(diǎn),負(fù)責(zé)控制計(jì)算節(jié)點(diǎn),啟動(dòng)Executor或者Driver;Driver:運(yùn)行Application;Executor:執(zhí)行器。Spark運(yùn)行架構(gòu)圖如下。分布式系統(tǒng)介紹KubernetesGoogle開源的一個(gè)容器編排引擎,它支持自動(dòng)化部署、大規(guī)??缮炜s、應(yīng)用容器化管理。Kubernetes將集群中的機(jī)器劃分為一個(gè)Master節(jié)點(diǎn)和一群工作節(jié)點(diǎn)(Node)。其中Master組件提供集群的管理控制中心;Node組件提供Kubernetes運(yùn)行時(shí)環(huán)境,以及維護(hù)Pod。分布式系統(tǒng)介紹其他分布式計(jì)算項(xiàng)目C(模擬全球氣象變化)Quake-CatcherNetwork(強(qiáng)力地震觀測(cè)預(yù)測(cè)網(wǎng))WorldCommunityGrid(查詢?nèi)祟惣膊〉闹委煼椒ǎ〦instein@Home(尋找脈沖星的引力波)FightAIDS@home(研究艾滋病生理原理和相關(guān)藥物)Folding@home(了解蛋白質(zhì)折疊)GIMPS(尋找新的梅森素?cái)?shù))D(破解密鎖)…2025/3/21DistributedComputing52Questions1)并行計(jì)算與分布式計(jì)算區(qū)別?2)分布式計(jì)算的核心技術(shù)是?3)什么是BONIC架構(gòu)?如何應(yīng)用在分布式計(jì)算應(yīng)用中?4)有哪些分布式計(jì)算模式?舉例說明相關(guān)實(shí)際應(yīng)用?5)分布式計(jì)算的核心技術(shù)是?第2章分布式編程基礎(chǔ)提綱進(jìn)程間通信Socket編程RMI編程P2P編程進(jìn)程間通信的定義分布式計(jì)算的核心技術(shù)是進(jìn)程間通信(interprocesscommunication,IPC),即在互相獨(dú)立的進(jìn)程(進(jìn)程是程序的運(yùn)行時(shí)表示)間通信及共同協(xié)作以完成某項(xiàng)任務(wù)的能力。計(jì)算機(jī)1計(jì)算機(jī)2互聯(lián)網(wǎng)單播通信與組播通信在分布式計(jì)算中,兩個(gè)或多個(gè)進(jìn)程按約定的某種協(xié)議進(jìn)行IPC,此處協(xié)議是指數(shù)據(jù)通信各參與進(jìn)程必須遵守的一組規(guī)則。在協(xié)議中,一個(gè)進(jìn)程有些時(shí)候可能是發(fā)送者,在其他時(shí)候則可能是接收者。單播組播IPC設(shè)施系統(tǒng)級(jí)IPC設(shè)施消息隊(duì)列共享內(nèi)存。。。高層的IPCAPI抽象開發(fā)分布式應(yīng)用往往工作量比較大且復(fù)雜更好地把注意力集中在應(yīng)用邏輯上API:ApplicationProgrammingInterface,應(yīng)用編程接口或應(yīng)用程序接口IPCAPI的四種基本操作發(fā)送(Send):該操作由發(fā)送進(jìn)程發(fā)起,旨在向接收進(jìn)程傳輸數(shù)據(jù)。操作必須允許發(fā)送進(jìn)程識(shí)別接收進(jìn)程和定義待傳數(shù)據(jù)。接收(Receive):該操作由接收進(jìn)程發(fā)起,旨在接收發(fā)送進(jìn)程發(fā)來(lái)的數(shù)據(jù)操作必須允許接收進(jìn)程識(shí)別發(fā)送進(jìn)程和定義保存數(shù)據(jù)的內(nèi)存空間,該內(nèi)存隨后被接收者訪問。連接(Connect):對(duì)面向連接的IPC,必須有允許在發(fā)起進(jìn)程和指定進(jìn)程間建立邏輯連擊的操作:其中以進(jìn)程發(fā)出請(qǐng)求連接操作而另一進(jìn)程發(fā)出接受連接操作。斷開連接(Disconnect):對(duì)面向連接的IPC,該操作允許通信的雙方關(guān)閉先前建立起來(lái)的某一邏輯連接。IPC使用示例:HTTP事件同步IPC中的一個(gè)主要難點(diǎn)是進(jìn)行IPC的各相關(guān)進(jìn)程是獨(dú)立執(zhí)行的,各進(jìn)程不知道對(duì)方進(jìn)程的情況。協(xié)議涉及的雙方必須按特定順序發(fā)起IPC操作,否則可能通信失敗。因此,參與通信的兩個(gè)進(jìn)程需要同步他們的操作,由一方發(fā)送數(shù)據(jù),另一方則需要等待所有數(shù)據(jù)發(fā)送完成時(shí),開始接收數(shù)據(jù)。IPC設(shè)施提供事件同步的最簡(jiǎn)單的方法是使用阻塞(blocking)機(jī)制或同步(synchronous),即掛起某一進(jìn)程的執(zhí)行,直到該進(jìn)程發(fā)起的某個(gè)操作執(zhí)行結(jié)束。另外,IPC操作可以是異步(asynchronous)或非阻塞操作(nonblocking)。進(jìn)程發(fā)起的異步操作不會(huì)引起阻塞。因此,一旦向IPC設(shè)施發(fā)出異步操作后,進(jìn)程可以繼續(xù)執(zhí)行。當(dāng)該異步操作完成后,進(jìn)程才會(huì)隨后得到IPC設(shè)施的通知。IPC范型在最低抽象層,IPC利用底層的串行或并行數(shù)據(jù)傳輸機(jī)制,在連接上傳輸二進(jìn)制流。例如,這種IPC范型可以用于編寫網(wǎng)絡(luò)驅(qū)動(dòng)軟件。這種形式的IPC屬于網(wǎng)絡(luò)或操作系統(tǒng)編程領(lǐng)域。下一個(gè)抽象層是眾所周知的一種范型,稱作socket應(yīng)用程序接口(socketAPI)。在socket范型中,兩個(gè)進(jìn)程使用名為socket的邏輯構(gòu)造交換數(shù)據(jù),每一方都要建立一個(gè)socket。待發(fā)送數(shù)據(jù)被寫入socket。在另一端,接收進(jìn)程從自身的socket中讀取或提取數(shù)據(jù)。遠(yuǎn)程過程調(diào)用(remoteprocedurecall)或遠(yuǎn)程方法調(diào)用(remotemethodinvocation)范型通過允許向遠(yuǎn)程進(jìn)程發(fā)送過程調(diào)用或方法調(diào)用,來(lái)提供更高層次的抽象。這是,數(shù)據(jù)作為參數(shù)和返回值,在兩個(gè)進(jìn)程間進(jìn)行傳遞。提綱進(jìn)程間通信Socket編程RMI編程P2P編程Socket歷史SocketAPI最早作為BerkeleyUnix操作系統(tǒng)的程序庫(kù),出現(xiàn)于20世紀(jì)80年代早期,用于提供IPC功能?,F(xiàn)在所有主流操作系統(tǒng)都支持SocketAPI。在BSD、Linux等基于Unix的系統(tǒng)中,SocketAPI都是操作系統(tǒng)的一部分。在個(gè)人計(jì)算機(jī)操作系統(tǒng)如MS-DOS、WindowsNT、Mac-OS、OS\2中,SocketAPI都是以程序庫(kù)形式提供的(在Windows系統(tǒng)中,SocketAPI稱為Winsocket)。Java語(yǔ)言在設(shè)計(jì)之初就考慮到了網(wǎng)絡(luò)編程,也將SocketAPI作為語(yǔ)言核心類的一部分提供給用戶。所有這些API都使用相同的消息傳遞模型和非常類似的語(yǔ)法。Socket現(xiàn)狀SocketAPI是實(shí)現(xiàn)進(jìn)程間通信的第一種編程設(shè)施。SocketAPI非常重要的原因主要有以下兩點(diǎn):1)SocketAPI已經(jīng)成為IPC編程事實(shí)上的標(biāo)準(zhǔn),高層IPC設(shè)施都是構(gòu)建于SocketAPI之上的,即它們基于SocketAPI實(shí)現(xiàn)的。2)對(duì)于響應(yīng)時(shí)間要求較高或在有限資源平臺(tái)上運(yùn)行的應(yīng)用來(lái)說,用SocketAPI實(shí)現(xiàn)是最合適的?;維ocket機(jī)制兩種主要的傳輸層協(xié)議UDP(UserDatagramProtocol,用戶數(shù)據(jù)包協(xié)議):允許使用無(wú)連接通信傳輸報(bào)文(即在傳輸層發(fā)送和接受)。被傳輸報(bào)文稱為數(shù)據(jù)報(bào)(datagram)。根據(jù)無(wú)連接通信協(xié)議,每個(gè)傳輸?shù)臄?shù)據(jù)包都被分別解析和路由,并且可按任何順序到達(dá)接收者。TCP(TransmissionControlProtocol,傳輸控制協(xié)議):面向連接的協(xié)議,它通過在接受者和發(fā)送者之間建立的邏輯連接來(lái)傳輸數(shù)據(jù)流。由于有連接,從發(fā)送者到接受者的數(shù)據(jù)能保證以與發(fā)送次序相同的順序被接受。兩種主要的傳輸層協(xié)議UDP:如果主機(jī)A上的進(jìn)程1通過順序傳輸數(shù)據(jù)包m1、m2,向主機(jī)B上的進(jìn)程2發(fā)送消息,這些數(shù)據(jù)包可以通過不同路由在網(wǎng)絡(luò)上傳輸,并且可按下列任何一種順序到達(dá)接收進(jìn)程:m1-m2或m2-m1。在數(shù)據(jù)通信網(wǎng)絡(luò)的術(shù)語(yǔ)中,“包”(或稱分組,英文為packet)是指在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)單位。每個(gè)包中都包含有效數(shù)據(jù)(載荷,payload)以及一些控制信息(頭部信息),如目的地址。TCP:如果主機(jī)A上的進(jìn)程1順序傳輸m1、m2,向主機(jī)B上的進(jìn)程2發(fā)送消息,接收進(jìn)程可以認(rèn)為消息將以m1-m2順序到達(dá),而不是m2-m1。兩種類型的Socket根據(jù)傳輸層所使用協(xié)議不同,SocketAPI分成兩種類型:數(shù)據(jù)包Socket:即DatagramSocket,一種使用UDP傳輸?shù)腟ocket。流式Socket:即StreamSocket,使用TCP傳輸?shù)腟ocket。提示:由于分布式計(jì)算與網(wǎng)絡(luò)應(yīng)用主要使用流式Socket比較多,后面將重點(diǎn)討論流式Socket的開發(fā)技術(shù)。兩種類型的SocketAPI數(shù)據(jù)報(bào)Socket(DatagramSocket)流式Socket(StreamSocket)流式SocketAPIJava流式Socket

API在Java中,有兩個(gè)類提供了流式SocketAPI:1)ServerSocket用于接受連接,我們將稱之為連接socket2)Socket用于數(shù)據(jù)交換,我們將稱之為數(shù)據(jù)socket流式Socket程序流類ServerSocket的主要方法和構(gòu)造函數(shù)Method/constructorDescriptionServerSocket(int

port)Createsaserversocketonaspecifiedport.Socketaccept()throwsIOExceptionListensforaconnectiontobemadetothissocketandacceptsit.Themethodblocksuntilaconnectionismade.publicvoidclose()throwsIOException

Closesthissocket.voidsetSoTimeout(int

timeout)throwsSocketExceptionSetatimeoutperiod(inmilliseconds)sothatacalltoaccept()forthissocketwillblockforonlythisamountoftime.Ifthetimeoutexpires,ajava.io.InterruptedIOExceptionisraised類Socket的主要方法和構(gòu)造函數(shù)Method/constructorDescriptionSocket(InetAddress

address,int

port)CreatesastreamsocketandconnectsittothespecifiedportnumberatthespecifiedIPaddressvoidclose()throwsIOExceptionClosesthissocket.InputStreamgetInputStream()throwsIOExceptionReturnsaninputstreamsothatdatamaybereadfromthissocket.OutputStream

getOutputStream()throwsIOExceptionReturnsanoutputstreamsothatdatamaybewrittentothissocket.voidsetSoTimeout(int

timeout)throwsSocketExceptionSetatimeoutperiodforblockingsothataread()callontheInputStreamassociatedwiththisSocketwillblockforonlythisamountoftime.Ifthetimeoutexpires,ajava.io.InterruptedIOExceptionisraised流式Socket基本語(yǔ)法//instantiatesasocketforacceptingconnectionServerSocketconnectionSocket=newServerSocket(portNo);SocketdataSocket=connectionSocket.accept();//getaoutputstreamforwritingtothedatasocketOutputStreamoutStream=dataSocket.getOutputStream();PrintWritersocketOutput=newPrintWriter(newOutputStreamWriter(outStream));socketOutput.println(message);socketOutput.flush();dataSocket.close();connectionSocket.close();//instantiatesadatasocketandconnectwithatimeoutSocketAddress

sockAddr=newInetSocketAddress(acceptorHost,acceptorPort);SocketmySocket=newSocket();inttimeoutPeriod=2000;//2secondsmySocket.connect(sockAddr,timeoutPeriod);//getaninputstreamforreadingfromthedatasocketInputStreaminStream=mySocket.getInputStream();BufferedReader

socketInput=newBufferedReader(newInputStreamReader(inStream));Stringmessage=socketInput.readLine();mySocket.close();類Example1ConnectionAcceptor類Example1ConnectionRequestor流式Socket基本語(yǔ)法在本例中有一些值得關(guān)注的地方:1)由于這里處理的是數(shù)據(jù)流,因此可使用Java類PrinterWriter向socket寫數(shù)據(jù)和使用BufferedReader從流中讀取數(shù)據(jù)。這些類中所使用的方法與向屏幕寫入一行或從鍵盤讀取一行文本相同。2)盡管本例將Acceptor和Requestor分別作為數(shù)據(jù)發(fā)送者和數(shù)據(jù)接收者介紹,但兩者的角色可以很容易地進(jìn)行互換。在那種情況下,Requestor將使用getOutputStream向socket中寫數(shù)據(jù),而Acceptor將使用getInputStream從socket中讀取數(shù)據(jù)。3)事實(shí)上,任一進(jìn)城都可以通過調(diào)用getInputStream和getOutputStream從流中讀取數(shù)據(jù)或向其中寫入數(shù)據(jù)。4)在本例中,每次只讀寫一行數(shù)據(jù)(分別使用readLine和println方法),但其實(shí)也可以每次只讀寫一行中的一部分?jǐn)?shù)據(jù)(分別使用read和print方法來(lái)實(shí)現(xiàn))。然而,對(duì)于以文本形式交換消息的文本協(xié)議來(lái)說,每次讀寫一行是標(biāo)準(zhǔn)做法。事件狀態(tài)圖隱藏?cái)?shù)據(jù)Socket細(xì)節(jié)publicclassExample2ConnectionAcceptor{publicstaticvoidmain(String[]args){…

ServerSocketconnectionSocket=newServerSocket(portNo);MyStreamSocketdataSocket=newMyStreamSocket(connectionSocket.accept());dataSocket.sendMessage(message);dataSocket.close();connectionSocket.close();…}//endmain}//endclass類Example2ConnectionAcceptor類Example2ConnectionRequestorpublicclassExample2ConnectionRequestor{publicstaticvoidmain(String[]args){…

MyStreamSocket

mySocket=newMyStreamSocket(acceptorHost,acceptorPort);Stringmessage=mySocket.receiveMessage();

mySocket.close();…}//endmain}//endclassMyStreamSocket類實(shí)現(xiàn)細(xì)節(jié)publicclassMyStreamSocketextendsSocket{privateSocketsocket;privateBufferedReaderinput;privatePrintWriteroutput;

MyStreamSocket(InetAddress

acceptorHost,intacceptorPort)throwsSocketException,IOException{socket=newSocket(acceptorHost,acceptorPort);

setStreams();}

MyStreamSocket(Socketsocket)throwsIOException{

this.socket=socket;

setStreams();}privatevoidsetStreams()throwsIOException{//getaninputstreamforreadingfromthedatasocket

InputStream

inStream=socket.getInputStream();input=newBufferedReader(newInputStreamReader(inStream));

OutputStream

outStream=socket.getOutputStream();output=newPrintWriter(newOutputStreamWriter(outStream));//createaobjectforcharacter-modeoutput}publicvoidsendMessage(Stringmessage)throwsIOException{

output.println(message);

output.flush();}//endsendMessagepublicStringreceiveMessage()throwsIOException{//readalinefromthedatastreamStringmessage=input.readLine();returnmessage;}//endreceiveMessage}//endclass提綱進(jìn)程間通信Socket編程RMI編程P2P編程RMI的定義RMI是RemoteMethodInvocation的縮寫,即遠(yuǎn)程方法調(diào)用。RMI是RPC模型的面向?qū)ο髮?shí)現(xiàn),是一種用于實(shí)現(xiàn)遠(yuǎn)程過程調(diào)用的應(yīng)用程序編程接口,它使客戶機(jī)上運(yùn)行的程序可以調(diào)用遠(yuǎn)程服務(wù)器上的對(duì)象。JavaRMI由于RMIAPI只適用于Java程序,所以,我們一般稱為JavaRMI。但該API相對(duì)簡(jiǎn)單,因此,非常適合于用作學(xué)習(xí)網(wǎng)絡(luò)應(yīng)用中分布式對(duì)象技術(shù)的入門資料。

JavaRMI使用接口化編程。在需要服務(wù)端的某一個(gè)遠(yuǎn)程對(duì)象時(shí),編程人員通過定義一個(gè)該對(duì)象的接口來(lái)隱藏它的實(shí)現(xiàn),并在客戶端定義一個(gè)相同的接口,客戶端使用該接口可以像本地調(diào)用一樣實(shí)現(xiàn)遠(yuǎn)程方法調(diào)用。通過調(diào)用RMI的API,對(duì)象服務(wù)器通過目錄服務(wù)導(dǎo)出和注冊(cè)遠(yuǎn)程對(duì)象,這些對(duì)象提供一些可以被客戶程序調(diào)用的遠(yuǎn)程方法。從語(yǔ)法上來(lái)看,RMI通過遠(yuǎn)程接口聲明遠(yuǎn)程對(duì)象,該接口是Java接口的擴(kuò)展;遠(yuǎn)程接口由對(duì)象服務(wù)器實(shí)現(xiàn);對(duì)象客戶使用與本地方法調(diào)用類似的語(yǔ)法訪問遠(yuǎn)程對(duì)象,并調(diào)用遠(yuǎn)程對(duì)象的方法。JavaRMI體系結(jié)構(gòu)從應(yīng)用層看,RMI由客戶應(yīng)用、服務(wù)器應(yīng)用和對(duì)象目錄服務(wù)3個(gè)部分。RMI系統(tǒng)實(shí)現(xiàn)架構(gòu)由三層組成:樁/框架(Stub/Skeleton)層:客戶端的樁和服務(wù)器端的框架;遠(yuǎn)程引用(remotereference)層:處理遠(yuǎn)程引用行為;傳輸層(transport):連接的建立和管理,以及遠(yuǎn)程對(duì)象的跟蹤。RMI基本分布式應(yīng)用遠(yuǎn)程接口定義服務(wù)器端軟件客戶端軟件RMI基本分布式應(yīng)用:遠(yuǎn)程接口定義在RMIAPI中,分布式對(duì)象的創(chuàng)建開始于遠(yuǎn)程接口。Java接口是為其他類提供模板的一種類:它包括方法聲明或簽名,其實(shí)現(xiàn)由實(shí)現(xiàn)該接口的類提供。Java遠(yuǎn)程接口是繼承Java類remote的一個(gè)接口,該類允許使用RMI語(yǔ)法實(shí)現(xiàn)接口。與必須為每個(gè)方法簽名定義擴(kuò)展和RemoteException不同,遠(yuǎn)程接口語(yǔ)法與常規(guī)或本地Java接口相同。RMI基本分布式應(yīng)用:遠(yuǎn)程接口定義importjava.rmi.*;publicinterfaceSomeInterface

extendsRemote{//signatureoffirstremotemethodpublicStringsomeMethod1()throwsjava.rmi.RemoteException;//signatureofsecondremotemethodpublicintsomeMethod2(intx)throwsjava.rmi.RemoteException;//signatureofotherremotemethodsmayfollow}//endinterfaceRMI基本分布式應(yīng)用:服務(wù)器端軟件對(duì)象服務(wù)器是指這樣的一種對(duì)象,它可以提供某一分布式對(duì)象的方法和接口。每個(gè)對(duì)象服務(wù)器必須:1)實(shí)現(xiàn)接口部分定義的每個(gè)遠(yuǎn)程方法;2)向目錄服務(wù)注冊(cè)包含了實(shí)現(xiàn)的對(duì)象。RMI基本分布式應(yīng)用:服務(wù)器端軟件import

java.rmi.*;import

java.rmi.server.*;publicclassSomeImplextendsUnicastRemoteObject

implementsSomeInterface{publicStringsomeMethod1()throwsRemoteException{//codetobesupplied}publicintsomeMethod2()throwsRemoteException{//codetobesupplied}}//endclass1)遠(yuǎn)程接口實(shí)現(xiàn)遠(yuǎn)程接口實(shí)現(xiàn)類的一個(gè)通用模板RMI基本分布式應(yīng)用:服務(wù)器端軟件1)遠(yuǎn)程接口實(shí)現(xiàn)import

java.rmi.*;import

java.rmi.server.*;publicclassHelloImplextendsUnicastRemoteObjectimplementsHelloInterface{publicHelloImpl()throwsRemoteException{super();}publicStringsayHello(Stringname)throwsRemoteException{return"WELCOMETORMI!Goodafternoon!"+name+".";}}//endclassRMI基本分布式應(yīng)用:服務(wù)器端軟件1)遠(yuǎn)程接口實(shí)現(xiàn)RMI基本分布式應(yīng)用:服務(wù)器端軟件2)stub和skeleton生成在RMI中,分布式對(duì)象需要為每個(gè)對(duì)象服務(wù)器和對(duì)象客戶提供代理,分別成為對(duì)象skeleton和stub。這些代理可通過使用JavaSDK提供的RMI編譯器rmic,編譯遠(yuǎn)程接口實(shí)現(xiàn)生成??稍诿钚邢螺斎胂率雒钌蓅tub和skeleton文件:rmic<classnameoftheremoteinterfaceimplementation>例如:rmicSomeImplRMI基本分布式應(yīng)用:服務(wù)器端軟件2)stub和skeleton生成如果編譯成功,將生成兩個(gè)代理文件,每個(gè)文件的名都以實(shí)現(xiàn)類的類名為前綴:SomeImpl_stub.classSomeImpl_skel.class但在Java2版本以上的平臺(tái)下,只生成stub文件。對(duì)象的stub文件及遠(yuǎn)程接口文件,必須被每個(gè)對(duì)象客戶所共享:這些文件是編譯客戶程序時(shí)所必須的文件??梢允止閷?duì)象客戶提供每個(gè)文件的一個(gè)拷貝。此外JavaRMI具有stub下載特征,允許客戶端動(dòng)態(tài)獲取stub文件。RMI基本分布式應(yīng)用:服務(wù)器端軟件3)對(duì)象服務(wù)器的實(shí)現(xiàn)SomeImplexportedObj=newSomeImpl();startRegistry(1234);registryURL="rmi://localhost:"+portNum+"/some";Naming.rebind(registryURL,exportedObj);listRegistry(registryURL);主機(jī)名

端口號(hào)引用名類Naming提供從注冊(cè)表獲取和存儲(chǔ)引用的方法。具體來(lái)說,rebind方法允許如下形式URL將對(duì)象引用存儲(chǔ)到注冊(cè)表中:主機(jī)名應(yīng)該是服務(wù)器名,或簡(jiǎn)寫成localhost,引用名指用戶選擇的名稱,該名稱在注冊(cè)表中應(yīng)該是惟一的。rebind方法將覆蓋注冊(cè)表中與給定引用名綁定的任何引用。如果不希望覆蓋,可以使用bind方法。URL:rmi://<hostname>:<portnumber>/<referencename>//檢查RMI注冊(cè)表當(dāng)前是否運(yùn)行在默認(rèn)端口上。如果不在,RMI注冊(cè)表將被激活。RMI基本分布式應(yīng)用:服務(wù)器端軟件3)對(duì)象服務(wù)器的實(shí)現(xiàn)此外,可以使用JDK中的rmiregistry工具在系統(tǒng)提示符輸入下列命令,手工激活RMI注冊(cè)表:rmiregistry<portnumber>

端口號(hào)(默認(rèn)1099)RMI對(duì)象服務(wù)器是并發(fā)服務(wù)器:每個(gè)對(duì)象客戶請(qǐng)求都使用服務(wù)器上的一個(gè)獨(dú)立線程服務(wù)。由于遠(yuǎn)程方法調(diào)用可并發(fā)執(zhí)行,因此遠(yuǎn)程對(duì)象實(shí)現(xiàn)的線程安全性非常重要。RMI基本分布式應(yīng)用:服務(wù)器端軟件3)對(duì)象服務(wù)器的實(shí)現(xiàn)RMI基本分布式應(yīng)用:客戶端軟件查找遠(yuǎn)程對(duì)象:如果對(duì)象服務(wù)器先前在注冊(cè)表中保存了對(duì)象引用,可以用類Naming的lookup方法獲取這些引用。注意,應(yīng)將獲取的引用傳給遠(yuǎn)程接口類。StringregistryURL="rmi://localhost:"+portNum+"/some";SomeInterfaceh=(SomeInterface)Naming.lookup(registryURL);調(diào)用遠(yuǎn)程方法:遠(yuǎn)程接口引用可以調(diào)用遠(yuǎn)程接口中的任何方法,例如:Stringmessage=h.method1();System.out.println(message);注意,調(diào)用遠(yuǎn)程方法的語(yǔ)法與調(diào)用本地方法相同。RMI應(yīng)用構(gòu)建步驟總結(jié)1)服務(wù)器端軟件開發(fā)算法為該應(yīng)用的所有待生成文件創(chuàng)建一個(gè)目錄。在SomeInterface.java中定義遠(yuǎn)程服務(wù)器接口。編譯并修改程序,直到不再有任何語(yǔ)法錯(cuò)誤。SomeImpl.java中實(shí)現(xiàn)接口,編譯并修改程序,直到不再有任何語(yǔ)法錯(cuò)誤。使用RMI編譯器rmic處理實(shí)現(xiàn)類,生成遠(yuǎn)程對(duì)象的stub文件

rmicSomeImpl可以從目錄中看到新生成文件SomeImpl_Stub.class,每次修改接口實(shí)現(xiàn)時(shí),都要重新執(zhí)行步驟3和步驟4創(chuàng)建對(duì)象服務(wù)器程序SomeServer.java,編譯并修改程序,直到不再有任何語(yǔ)法錯(cuò)誤。激活對(duì)象服務(wù)器javaSomeServerRMI應(yīng)用構(gòu)建步驟2)客戶端軟件開發(fā)算法為該應(yīng)用的所有待生成文件創(chuàng)建一個(gè)目錄獲取遠(yuǎn)程接口類文件的一個(gè)拷貝,也可獲取遠(yuǎn)程接口源文件的一個(gè)拷貝,使用javac編譯程序,生成接口文件。獲取接口實(shí)現(xiàn)stub文件SomeImpl_stub.class的一個(gè)拷貝開發(fā)客戶程序SomeClient.java,編譯程序,生成客戶類激活客戶javaSomeClientRMI應(yīng)用構(gòu)建步驟2)客戶端軟件開發(fā)算法客戶類程序與任何其他Java類相似。RMI所需的語(yǔ)法包括定位服務(wù)器主機(jī)的RMI注冊(cè)表和查找服務(wù)器對(duì)象的遠(yuǎn)程引用;該引用隨后可被傳到遠(yuǎn)程接口類和被調(diào)用的遠(yuǎn)程方法查找遠(yuǎn)程對(duì)象:如果對(duì)象服務(wù)器先前在注冊(cè)表中保存了對(duì)象引用,可以用類Naming的lookup方法獲取這些引用。注意,應(yīng)將獲取的引用傳給遠(yuǎn)程接口類。

StringregistryURL="rmi://localhost:"+portNum+"/some";

SomeInterfaceh=(SomeInterface)Naming.lookup(registryURL);調(diào)用遠(yuǎn)程方法:遠(yuǎn)程接口引用可以調(diào)用遠(yuǎn)程接口中的任何方法,例如:

Stringmessage=h.method1();System.out.println(message);注意,調(diào)用遠(yuǎn)程方法的語(yǔ)法與調(diào)用本地方法相同。RMI應(yīng)用構(gòu)建步驟2)客戶端軟件開發(fā)算法基本RMI應(yīng)用程序演示RMI應(yīng)用的HelloWorld實(shí)現(xiàn)程序:HelloInterface.javaHelloImpl.javaHelloServer.javaHelloClient.javaHelloWorld程序演示RMI應(yīng)用構(gòu)建步驟3)測(cè)試和調(diào)試構(gòu)建最小RMI程序的一個(gè)模板。從一個(gè)遠(yuǎn)程接口開始,其中包括一個(gè)方法簽名,一個(gè)stub實(shí)現(xiàn),一個(gè)輸出對(duì)象的服務(wù)器程序以及一個(gè)足以用來(lái)調(diào)用遠(yuǎn)程方法的客戶程序。在單機(jī)上測(cè)試模板程序,直到遠(yuǎn)程方法調(diào)用成功。每次在接口中增加一個(gè)方法簽名。每次增加后都修改客戶程序來(lái)調(diào)用新增方法。完善遠(yuǎn)程方法定義內(nèi)容,每次只修改一個(gè)。在繼續(xù)下一個(gè)方法之前,測(cè)試并徹底調(diào)試每個(gè)新增方法。完全測(cè)試所有遠(yuǎn)程方法后,采用增量式方法開發(fā)客戶應(yīng)用。每次增加后,都測(cè)試和調(diào)試程序。將程序部署到多臺(tái)機(jī)器上,測(cè)試并調(diào)試。RMI和socketAPI的比較遠(yuǎn)程方法調(diào)用API作為分布式對(duì)象計(jì)算范型的代表,是構(gòu)建網(wǎng)絡(luò)應(yīng)用的有效工具。它可用來(lái)取代socketAPI快速構(gòu)建網(wǎng)絡(luò)應(yīng)用。在RMIAPI和socketAPI之間權(quán)衡時(shí),需要考慮以下因素:1)socketAPI的執(zhí)行與操作系統(tǒng)密切相關(guān),因此執(zhí)行開銷更小,RMI需要額外的中間件支持,包括代理和目錄服務(wù),這些不可避免地帶來(lái)運(yùn)行時(shí)開銷。對(duì)有高性能要求的應(yīng)用來(lái)說,socketAPI仍將是惟一可行途徑。2)RMIAPI提供了使軟件開發(fā)任務(wù)更為簡(jiǎn)單的抽象。用高級(jí)抽象開發(fā)的程序更易理解,因此也更易調(diào)試。RMI和socketAPI的比較由于運(yùn)行在低層,socketAPI通常是平臺(tái)和語(yǔ)言獨(dú)立的,RMI則不一定。例如JavaRMI需要特定的Java運(yùn)行時(shí)支持。結(jié)果是,使用JavaRMI實(shí)現(xiàn)的應(yīng)用必須用Java編寫,并且也只能運(yùn)行在Java平臺(tái)上。在設(shè)計(jì)應(yīng)用系統(tǒng)時(shí),是否能選擇適當(dāng)?shù)姆缎秃虯PI是非常關(guān)鍵的。依賴于具體環(huán)境,可以在應(yīng)用的某些部分使用某種范型或API,而在其他部分使用另一種范型或API。由于使用RMI開發(fā)網(wǎng)絡(luò)應(yīng)用相對(duì)簡(jiǎn)單,RMI是快速開發(fā)應(yīng)用原型的一個(gè)很好的候選工具。提綱進(jìn)程間通信Socket編程RMI編程P2P編程P2P的定義P2P,即Peer-to-Peer的縮寫,常稱它為“點(diǎn)對(duì)點(diǎn)”或者“端對(duì)端”,而學(xué)術(shù)界常稱它為“對(duì)等計(jì)算”。P2P是一種以非集中化方式使用分布式資源來(lái)完成計(jì)算任務(wù)的一種分布式計(jì)算模式。非集中化:P2P系統(tǒng)中并非采用傳統(tǒng)的以服務(wù)器為中心管理所有客戶端的方法,而是消除“中心”的概念,將原來(lái)的客戶端視為服務(wù)器和客戶端的綜合體;分布式資源:P2P系統(tǒng)的參與者共享自己的一部分空閑資源供系統(tǒng)處理關(guān)鍵任務(wù)所用,這些資源包括處理能力、數(shù)據(jù)文件、數(shù)據(jù)存儲(chǔ)和網(wǎng)絡(luò)帶寬等。P2P的優(yōu)點(diǎn)P2P技術(shù)打破了傳統(tǒng)的Client/Server(縮寫為C/S)模式,在P2P網(wǎng)絡(luò)中所有結(jié)點(diǎn)的地位都是對(duì)等的,每個(gè)結(jié)點(diǎn)既充當(dāng)服務(wù)器,又充當(dāng)客戶端,這樣緩解了中心服務(wù)器的壓力,使得資源或任務(wù)處理更加的分散化。由于P2P網(wǎng)絡(luò)中結(jié)點(diǎn)是Client和Server的綜合體,因此結(jié)點(diǎn)也被形象地稱為“SERVENT”。C/S模式與P2P模式對(duì)比C/S模式P2P模式C/S模式與P2P模式對(duì)比C/S模式:服務(wù)器和客戶端之間是一對(duì)多的主從關(guān)系,系統(tǒng)的信息和數(shù)據(jù)都保存在中心服務(wù)器上若要索取信息,必須先訪問服務(wù)器,才能得到所需的信息,且客戶端之間是沒有交互能力的。P2P模式:不區(qū)分提供信息的服務(wù)器和請(qǐng)求信息的客戶端,每一個(gè)結(jié)點(diǎn)都是信息的發(fā)布者和請(qǐng)求者,對(duì)等結(jié)點(diǎn)之間可以實(shí)現(xiàn)自治交互,無(wú)需使用服務(wù)器。每個(gè)對(duì)等結(jié)點(diǎn)都可以在網(wǎng)絡(luò)中發(fā)布和分享信息,使得網(wǎng)絡(luò)中閑散的資源得到充分利用。不需要花費(fèi)高昂的費(fèi)用來(lái)維護(hù)中心服務(wù)器?;赑2P范型的即時(shí)聊天系統(tǒng)開發(fā)由于演示的是簡(jiǎn)單的P2P即時(shí)聊天系統(tǒng),所以,我們僅僅設(shè)計(jì)了如下幾個(gè)功能:(1)點(diǎn)對(duì)點(diǎn)單人聊天;(2)多人同時(shí)在線聊天;(3)用戶可以自由加入和退出系統(tǒng);(4)具備用戶在線狀態(tài)監(jiān)視。1)確定系統(tǒng)實(shí)現(xiàn)功能為了更好地理解P2P分布式計(jì)算模式和P2P應(yīng)用的開發(fā)方法,本節(jié)使用JavaSocket來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的基于P2P范型的即時(shí)聊天系統(tǒng)。系統(tǒng)的功能基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)為了簡(jiǎn)單起見,我們采用類似于中心化拓?fù)浣Y(jié)構(gòu)的P2P模式,所有客戶都需要與中心服務(wù)器相連,并將自己的網(wǎng)絡(luò)地址寫入服務(wù)器中,服務(wù)器只需要監(jiān)聽和更新用戶列表信息,并發(fā)送給客戶最新的用戶列表信息即可。當(dāng)需要點(diǎn)對(duì)點(diǎn)聊天時(shí),客戶端只需要從本地用戶列表中讀取目標(biāo)用戶的網(wǎng)絡(luò)地址,并連接目標(biāo)用戶,即可實(shí)現(xiàn)通信。因?yàn)槭荘2P系統(tǒng),客戶端要同時(shí)扮演服務(wù)器和客戶端兩個(gè)角色,所以,用戶登錄后都會(huì)創(chuàng)建一個(gè)接收其他用戶連接的監(jiān)聽線程,以實(shí)現(xiàn)服務(wù)器的功能。2)確定P2P模式基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)創(chuàng)建Socket、綁定地址和端口號(hào),監(jiān)聽并接受客戶端的連接請(qǐng)求。服務(wù)器端在客戶連接后自動(dòng)獲取客戶端用戶名、IP地址和端口號(hào),并將其保存在服務(wù)器端的用戶列表中,同時(shí)更新所有在線用戶的客戶端在線用戶列表信息,以方便客戶了解上下線的實(shí)時(shí)情況,以進(jìn)行聊天。當(dāng)有用戶下線時(shí),服務(wù)器端要能即時(shí)監(jiān)聽到,并更新用戶列表信息,發(fā)送給所有在線客戶端。對(duì)在線用戶數(shù)量進(jìn)行統(tǒng)計(jì)。3)確定服務(wù)器主要任務(wù)基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)客戶端創(chuàng)建Socket,并調(diào)用connect()函數(shù),向中心服務(wù)器發(fā)送連接請(qǐng)求。客戶端在登錄后也必須充當(dāng)服務(wù)器,以接收其他用戶的連接請(qǐng)求,所有需要?jiǎng)?chuàng)建一個(gè)用戶接收線程來(lái)監(jiān)聽。用戶登錄后需要接收來(lái)自服務(wù)器的所有在線用戶信息列表,并更新本地的用戶列表信息,以方便選擇特定用戶進(jìn)行聊天??蛻舳丝梢允褂萌喊l(fā)功能,向在線用戶列表中的所有用戶發(fā)送聊天信息。4)確定客戶端主要任務(wù)基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)服務(wù)器主要任務(wù)客戶端主要任務(wù)創(chuàng)建Socket、綁定地址和端口號(hào),監(jiān)聽并接受客戶端的連接請(qǐng)求自動(dòng)獲取客戶端用戶名、IP地址和端口號(hào),并將其保存在服務(wù)器端的用戶列表中,同時(shí)更新所有在線用戶的客戶端在線用戶列表信息當(dāng)有用戶下線時(shí),服務(wù)器端要能即時(shí)監(jiān)聽到,并更新用戶列表信息,發(fā)送給所有在線客戶端。對(duì)在線用戶數(shù)量進(jìn)行統(tǒng)計(jì)。創(chuàng)建Socket,并調(diào)用connect()函數(shù),向中心服務(wù)器發(fā)送連接請(qǐng)求。在登錄后也必須充當(dāng)服務(wù)器,接收其他用戶的連接請(qǐng)求,需要?jiǎng)?chuàng)建一個(gè)用戶接收線程來(lái)監(jiān)聽用戶登錄后需要接收來(lái)自服務(wù)器的所有在線用戶信息列表,并更新本地的用戶列表信息客戶端可以使用群發(fā)功能,向在線用戶列表中的所有用戶發(fā)送聊天信息注意,服務(wù)器向所有客戶發(fā)送最新用戶列表信息,及客戶端的群發(fā)功能,都是通過簡(jiǎn)單地遍歷用戶列表來(lái)實(shí)現(xiàn)?;赑2P范型的即時(shí)聊天系統(tǒng)開發(fā)中心服務(wù)器啟動(dòng)后會(huì)自動(dòng)創(chuàng)建一個(gè)監(jiān)聽線程,以接受客戶端發(fā)來(lái)的連接請(qǐng)求。當(dāng)客戶端與服務(wù)器連接后,客戶端會(huì)將自己的信息(用戶名、IP地址和端口號(hào)等)寫入socket,服務(wù)器端從此socket中讀取該用戶信息,并登記到用戶信息列表中。然后,服務(wù)器將最新的用戶信息列表群發(fā)給所有在線的客戶端,以便客戶端得到最新的用戶列表。步驟1、2展示了客戶登陸服務(wù)器的過程。5)確定交互過程:登陸基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)每個(gè)連接到中心服務(wù)器的客戶都會(huì)得到最新的用戶信息列表。如步驟3所示,若Client2欲與Client3聊天,則Client2檢索自己的用戶信息列表,得到Client3的用戶信息后,便可與Client3進(jìn)行連接,實(shí)現(xiàn)通信。此過程,并不需要中心服務(wù)器的干預(yù)。5)確定交互過程:通信基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)當(dāng)有一個(gè)客戶需要下線時(shí),例如圖中的Client1,那么Client1首先將下線請(qǐng)求寫入socket,中心服務(wù)器接收到含有下線請(qǐng)求標(biāo)記的信息后,Client1便通過握手機(jī)制下線(為了安全關(guān)閉socket)。Client1安全下線后,中心服務(wù)器會(huì)將Client1的用戶信息從在線列表中刪除,并將更新后的用戶列表、下線用戶名稱和當(dāng)前網(wǎng)絡(luò)的在線用戶情況等群發(fā)給所有在線客戶端,以便客戶端得到最新的在線用戶列表。5)確定交互過程:登出基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)客戶端的群發(fā)功能與服務(wù)器端的群發(fā)類似,都采用遍歷用戶列表的方法。例如,圖中Client3欲與所有在線用戶聊天,則只要遍歷Client3的在線用戶列表,與所有在線用戶進(jìn)行連接,便可以進(jìn)行群聊。5)確定交互過程:群聊基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)6)系統(tǒng)實(shí)現(xiàn)類圖基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)7)確定系統(tǒng)界面:Server端基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)7)確定系統(tǒng)界面:Client端基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)8)主要類實(shí)現(xiàn)說明1)首先設(shè)計(jì)中心服務(wù)器和客戶端系統(tǒng)界面。創(chuàng)建中心服務(wù)器Server類,派生自JFrame類。同樣,創(chuàng)建客戶端Client類,也派生自JFrame類。Server和Client都需要實(shí)現(xiàn)ActionListener接口,從而對(duì)界面上的按鈕等動(dòng)作進(jìn)行監(jiān)聽。2)創(chuàng)建P2P網(wǎng)絡(luò)結(jié)點(diǎn)Node類,其中包含用戶名、IP地址、端口號(hào)和一個(gè)結(jié)點(diǎn)變量next。3)創(chuàng)建RandomPort類用于客戶端分配隨機(jī)可用端口號(hào)。4)創(chuàng)建用戶列表類UserInfo,它用于維護(hù)中心服務(wù)器端和客戶端的在線用戶信息。5)實(shí)現(xiàn)中心服務(wù)器Server類,Server類中除了包含系統(tǒng)界面上的一些組件成員外,還有用于維護(hù)在線用戶信息的UserInfo對(duì)象、用于連接的ServerSocket對(duì)象和Socket對(duì)象,及用于套接字輸入、出流的對(duì)象。6)創(chuàng)建Server端用于與客戶端連接的線程ServerReceiveThread類,它主要負(fù)責(zé)接受客戶端的連接請(qǐng)求、更新在線用戶列表,并發(fā)送給所有客戶端等。基于P2P范型的即時(shí)聊天系統(tǒng)開發(fā)8)主要類實(shí)現(xiàn)說明7)實(shí)現(xiàn)客戶端Client類,除了包含界面上所示的一些組件成員外,還包括用于連接的套接字對(duì)象、套接字輸入出流、接收其他客戶端連接請(qǐng)求的線程對(duì)象等??蛻舳说闹饕袨榘ㄌ幚斫缑姘粹o產(chǎn)生的動(dòng)作、給點(diǎn)對(duì)點(diǎn)用戶或所有用戶發(fā)送信息、及一個(gè)用于與服務(wù)器連接,并獲取服務(wù)器更新用戶列表的內(nèi)部類ComWithServer。8)創(chuàng)建ComWithServer類,它主要負(fù)責(zé)與服務(wù)器連接、創(chuàng)建客戶端接收線程、更新用戶信息等。9)創(chuàng)建客戶端信息接收線程類ClientReceiveThread,當(dāng)一個(gè)Client創(chuàng)建時(shí),會(huì)同時(shí)為此客戶創(chuàng)建一個(gè)接收線程,以把自己當(dāng)做服務(wù)器,接收來(lái)自其他客戶端的聊天信息。10)客戶端還需要?jiǎng)?chuàng)建一個(gè)線程用于發(fā)送自己的信息給連接的類一端,因此創(chuàng)建客戶端發(fā)送線程ClientSendThread類,它的成員主要包括連接地址、端口、及發(fā)送信息,run方法主要負(fù)責(zé)獲取連接的輸入出流,然后將自己的聊天信息,寫入流中即可?;赑2P范型的即時(shí)聊天系統(tǒng)開發(fā)9)系統(tǒng)運(yùn)行詳細(xì)過程當(dāng)單擊“啟動(dòng)服務(wù)器”按鈕時(shí),會(huì)觸發(fā)調(diào)用類Server的startServer()方法,該方法為服務(wù)器選定特定的端口號(hào),并創(chuàng)建服務(wù)器端監(jiān)聽線程serverListenThread(服務(wù)器端監(jiān)聽線程類ServerListenThread的一個(gè)實(shí)例),等待客戶端的連接請(qǐng)求。同時(shí),服務(wù)器還會(huì)創(chuàng)建一個(gè)線程ServerReceiveThread,用于接收客戶端發(fā)來(lái)的下線請(qǐng)求,并將更新后的用戶列表群發(fā)給所有用戶。當(dāng)客戶端與服務(wù)器連接后,會(huì)創(chuàng)建一個(gè)線程ComWithServer,用于將自己的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論