http://www.javaworld.com/javaworld/jw-10-2001/jw-1019-jxta-p2.html
中文地址
http://www.matrix.org.cn/resource/article/43/43627_P2P_Jxta.html
摘要
Peer-to-Peer網(wǎng)絡(luò)毫無(wú)疑問(wèn)是當(dāng)今的熱點(diǎn)技術(shù)主題。Napster和Gnutella的廣泛使用證明了peer-to-peer應(yīng)用的強(qiáng)大潛力。鑒于在這個(gè)定于大量的重復(fù)勞動(dòng),Sun Microsystems發(fā)起了Jxta工程-新一代的p2p應(yīng)用程序開(kāi)發(fā)平臺(tái)。本文專門探討了P2P和Jxta在這方面的成果。可以作為早期接觸者,程序員,愛(ài)好者開(kāi)發(fā)P2P應(yīng)用程序的簡(jiǎn)介。(4,100 詞;十月 19日,2001年)
今天的Internet正在驗(yàn)證一種變革。這種變革將會(huì)改變網(wǎng)絡(luò)的一個(gè)基本特征。所有的網(wǎng)絡(luò)終端包括桌面電腦,PDA,移動(dòng)電話,都要要求更高的網(wǎng)絡(luò)狀況。這場(chǎng)變革在諸如Napster 和 Gnutella的應(yīng)用軟件推動(dòng)下,將會(huì)終結(jié)以服務(wù)器為主導(dǎo)的Internet。這場(chǎng)變革就是P2P。
P2P(或者說(shuō)peer-to-peer)網(wǎng)絡(luò)是一種基于操作上下文的網(wǎng)絡(luò)模型,任何一個(gè)節(jié)點(diǎn)都同時(shí)作為客戶機(jī)和服務(wù)器。由于在傳統(tǒng)的客戶機(jī)/服務(wù)器模式當(dāng)中,客戶機(jī)和服務(wù)器的角色已經(jīng)實(shí)現(xiàn)定義好了,所以這是一種他們所不能提供的能力。
在這片文章里,我對(duì)比了p2p網(wǎng)絡(luò)與client/server網(wǎng)絡(luò)。并介紹了Jxta(發(fā)音為jux-ta)這種由Bill Joy(Sun公司首席科學(xué)家兼公司執(zhí)行官)引領(lǐng)開(kāi)發(fā)的P2P計(jì)算平臺(tái)。目前,Jxta由數(shù)百名開(kāi)源開(kāi)發(fā)者共同實(shí)現(xiàn)。Jxta工程承載P2P世界的多個(gè)期望。它定義了一系列協(xié)議,開(kāi)發(fā)者使用這些協(xié)議可以開(kāi)發(fā)幾乎所有的p2p程序。同時(shí)這些協(xié)議還可以適應(yīng)應(yīng)用程序所特有的需求。Jxta并沒(méi)有規(guī)定所使用的編程語(yǔ)言和使用環(huán)境,但是使用Java語(yǔ)言開(kāi)發(fā)P2P程序具有先天的優(yōu)勢(shì),例如:可移植性,開(kāi)發(fā)難度低,具有豐富的類庫(kù)。
P2P:總攬
現(xiàn)在大多數(shù)的分布式計(jì)算模型是基于client/server形式的。圖1描述了一個(gè)典型的client/server架構(gòu)。

這種架構(gòu)下的工作模式是,客戶機(jī)發(fā)出服務(wù)請(qǐng)求,服務(wù)器響應(yīng)服務(wù)請(qǐng)求并提供服務(wù)。在Internet上存在這大量各種各樣的服務(wù)器?D?Dweb服務(wù)器,郵件服務(wù)器,F(xiàn)TP服務(wù)器,等等。Client/server架構(gòu)是一種典型的中央集中式架構(gòu),整個(gè)網(wǎng)絡(luò)服務(wù)都依存中央節(jié)點(diǎn)(服務(wù)器)而存在。如果沒(méi)有服務(wù)器,網(wǎng)絡(luò)就存在就沒(méi)有價(jià)值;沒(méi)有它們,Web瀏覽器將如何工作?所以說(shuō)無(wú)論有多少瀏覽器和用戶的存在,網(wǎng)絡(luò)只有在存在的情況下才能工作。
和client/server架構(gòu)類似,P2P同樣也是一種分布式網(wǎng)絡(luò)架構(gòu)。但它和client/server架構(gòu)有一個(gè)顯著的不同點(diǎn)。P2P架構(gòu)是一種非集中架構(gòu)(見(jiàn)圖2),在網(wǎng)絡(luò)中沒(méi)有服務(wù)器或是客戶機(jī)的概念。對(duì)于網(wǎng)絡(luò)中的每一個(gè)實(shí)體,都會(huì)被認(rèn)為是一個(gè)對(duì)等點(diǎn)(peer),它們擁有相同的地位,任何一個(gè)實(shí)體都可以請(qǐng)求服務(wù)(client的特性)和提供服務(wù)(server的特性)。圖2圖示了一個(gè)P2P網(wǎng)絡(luò)。

雖然所有的peer在網(wǎng)絡(luò)中都具有相同的地位,但并不是所有的peer都需要具有相同的性能。在P2P網(wǎng)絡(luò)當(dāng)中,可以均有不同性能的多種節(jié)點(diǎn),從移動(dòng)設(shè)備到工作站。一個(gè)移動(dòng)peer由于其內(nèi)在的限制即使網(wǎng)絡(luò)允許可能也并不能像服務(wù)器那樣工作。
兩種網(wǎng)絡(luò)模型各有優(yōu)缺點(diǎn)。可以想想如圖1那種的client/server架構(gòu),在網(wǎng)絡(luò)增長(zhǎng)(client越來(lái)越多時(shí)),不可避免的將壓力附加給中央節(jié)點(diǎn)服務(wù)器。每增加一個(gè)用戶,服務(wù)器的能力就相對(duì)下降一些;當(dāng)服務(wù)器崩潰的時(shí)候整個(gè)網(wǎng)絡(luò)也就被摧毀了。
P2P網(wǎng)絡(luò)將不同的場(chǎng)景傳送出去。由于每一個(gè)實(shí)體(或peer)在網(wǎng)絡(luò)中都是一個(gè)活躍的參與者,所以peer將自身的特定資源貢獻(xiàn)給整個(gè)網(wǎng)絡(luò),例如存儲(chǔ)空間和CPU計(jì)算周期。當(dāng)越來(lái)越多的peer加入網(wǎng)絡(luò)當(dāng)中的時(shí)候,網(wǎng)絡(luò)的能力也就隨之增長(zhǎng)。應(yīng)此,隨著網(wǎng)絡(luò)的增長(zhǎng),網(wǎng)絡(luò)自身的能力也會(huì)越變?cè)綇?qiáng)。這種擴(kuò)展性是client/server架構(gòu)所不具備的。
P2P網(wǎng)絡(luò)區(qū)別于client/server模型的令一個(gè)特性是只要有一個(gè)peer是活躍的那么網(wǎng)絡(luò)就被認(rèn)為是可用的。P2P網(wǎng)絡(luò)只有在沒(méi)有任何一個(gè)節(jié)點(diǎn)是活躍的時(shí)候才不可用。
在獲得P2P網(wǎng)絡(luò)提供優(yōu)勢(shì)特性的同時(shí),你將會(huì)付出如下的代價(jià)。首先,相比client/server模型來(lái)說(shuō),P2P網(wǎng)絡(luò)的管理如同一場(chǎng)惡夢(mèng)。P2P網(wǎng)絡(luò)的上的增強(qiáng)安全策略,備份策略都將會(huì)更為復(fù)雜。其次,P2P協(xié)議相比client/server協(xié)議來(lái)說(shuō)更加“多變”,peer可以隨時(shí)的加入或者退出網(wǎng)絡(luò)。這種瞬時(shí)變化的特性將會(huì)引發(fā)對(duì)性能的擔(dān)憂。(參看"Bandwidth Barriers to Gnutella Network Scalability"獲取更多的信息)
Jxta 解決方案
不同的協(xié)議,不同的架構(gòu),不同的實(shí)現(xiàn)是對(duì)P2P解決方案現(xiàn)狀的真實(shí)描述。目前,開(kāi)發(fā)者門使用了很多種不同的方案來(lái)實(shí)現(xiàn)P2P應(yīng)用。在client/server世界中顯的過(guò)剩的“標(biāo)準(zhǔn)”,在P2P世界中顯的如此罕見(jiàn)。用了解決這個(gè)問(wèn)題,Sun公司開(kāi)發(fā)了Jxta。
摘自Jxta的目標(biāo)聲明:
Jxta致力于為P2P應(yīng)用提供一個(gè)P2P平臺(tái)基礎(chǔ)。其中包括一系列獨(dú)立于語(yǔ)言,平臺(tái)和網(wǎng)絡(luò)技術(shù)之外的協(xié)議(假設(shè)并不知道網(wǎng)絡(luò)的下層實(shí)現(xiàn))。這些協(xié)議解決了P2P應(yīng)用的基本需求。協(xié)議的設(shè)計(jì)目標(biāo)是簡(jiǎn)單并且低成本,引用Jxta目標(biāo)聲明的話就是“每一個(gè)設(shè)備都有一個(gè)數(shù)字心跳”(every device with a digital heartbeat,這句話實(shí)在不好翻譯)。
Jxta目前定義了6個(gè)協(xié)議,但并不是要求Jxta peer實(shí)現(xiàn)全部的6個(gè)協(xié)議。Peer實(shí)現(xiàn)協(xié)議的數(shù)量取決于這個(gè)peer的能力;一個(gè)peer甚至可以只實(shí)現(xiàn)一個(gè)協(xié)議。Peer也能夠根據(jù)自身的需求擴(kuò)展任意一個(gè)協(xié)議。
值得注意的一點(diǎn)是Jxta協(xié)議本身并不保證互操作性。Jxta和TCP/IP在應(yīng)用的時(shí)候是類同的。正如雖然FTP和HTTP都是建立在TCP/IP基礎(chǔ)之上的,但你不能用FTP客戶端去訪問(wèn)網(wǎng)頁(yè)。在Jxta中也一樣,假如有兩種應(yīng)用都是建立在Jxta之上的,并不說(shuō)明它們之間一定能夠具有互操作性。互操作性有開(kāi)發(fā)者自己設(shè)計(jì)實(shí)現(xiàn)。盡管如此,開(kāi)發(fā)者將應(yīng)用建立在Jxt提供的護(hù)操作層之上,這樣就減少了對(duì)于護(hù)操作性的實(shí)現(xiàn)困難。
Jxta中的XML
不容置疑,提供統(tǒng)一的基礎(chǔ)協(xié)議的第一部就是采用一種可以在大多數(shù)平臺(tái)上標(biāo)示的語(yǔ)言形式。XML是一種完美的選擇。Jxta的開(kāi)發(fā)者意識(shí)到XML很快就會(huì)成為數(shù)據(jù)交換的缺省標(biāo)準(zhǔn)。XML提供了一種全局的,具有語(yǔ)言獨(dú)立性和平臺(tái)獨(dú)立性的數(shù)據(jù)表示形式。同時(shí)XML也可以很容易的轉(zhuǎn)變?yōu)槠渌幋a形式。所以,Jxta使用XML定義所有的協(xié)議。
盡管Jxta的消息是使用XML定義的,但Jxta并不依賴于XML編碼。事實(shí)上,解析器是一個(gè)可選的組件,一個(gè)Jxta的實(shí)體甚至并不需要一個(gè)XML的解析器。考慮到XML是一種方便的數(shù)據(jù)表示形式。例如移動(dòng)電話這樣小的實(shí)體可能會(huì)使用預(yù)先編譯好XML消息。
Jxta的術(shù)語(yǔ):
在我們了解進(jìn)一步的概念之前,我們來(lái)迅速瀏覽一下Jxta的多種概念。
Peers (對(duì)等點(diǎn))
???? 任何實(shí)現(xiàn)一個(gè)或多個(gè)Jxta協(xié)議的實(shí)體。一個(gè)Peer可以是從大型機(jī)到移動(dòng)電話,甚至是一個(gè)移動(dòng)傳感器的任何設(shè)備。Peer是獨(dú)立存在的,并且與其它Peer的通信都是異步的。
Peer groups (對(duì)等點(diǎn)組)
???? 具有相同興趣的Peer可以集結(jié)成Peer Group(對(duì)等點(diǎn)組)。對(duì)等點(diǎn)組可能跨越多種物理網(wǎng)絡(luò)。
Messages(消息)
??????Jxta網(wǎng)絡(luò)中的所有通信都通過(guò)接收和發(fā)送消息(messages)的方式來(lái)實(shí)現(xiàn)。這些Messages叫做Jxta消息,這些消息具有標(biāo)準(zhǔn)的格式,這也是具有護(hù)操作性的關(guān)鍵。
Pipes(管道)
??????管道在Jxta環(huán)境當(dāng)中建立虛擬的通信通道。Peer使用管道來(lái)發(fā)送和接收J(rèn)xta 消息。管道是一種虛擬的概念,peer不需要知道它們所在的實(shí)際網(wǎng)絡(luò)地址就可以使用管道,這是一種重要的抽象。
Services(服務(wù))
?? Peer和peer group都可以提供服務(wù)。由peer提供的服務(wù)屬于個(gè)人級(jí)服務(wù),叫做peer服務(wù),這種服務(wù)的方式和中央集中式服務(wù)相同。沒(méi)有其它peer提供這種服務(wù);如果這個(gè)peer不是活躍的,怎么這種服務(wù)就是不可用的。
?? Peer Group提供的服務(wù)叫做peer group服務(wù)(對(duì)等組服務(wù))。和peer 服務(wù)不同的是,這種服務(wù)不只是針對(duì)某一個(gè)特殊用戶的,而是針對(duì)這個(gè)Group中的多個(gè)用戶。Peer Group服務(wù)更容易被使用,原因是當(dāng)某一個(gè)用戶不可用的時(shí)候,其它的peer仍然會(huì)提供同樣的服務(wù)。
Codats(代碼/數(shù)據(jù))
?? Codat(代碼/數(shù)據(jù)),在Jxta當(dāng)中,這個(gè)詞說(shuō)明內(nèi)容可以是代碼或是數(shù)據(jù)。Codats可以被發(fā)布,發(fā)現(xiàn),或是在必要是取代。
Advertisements(廣告)
??????廣告用來(lái)發(fā)布和接收J(rèn)xta網(wǎng)絡(luò)用的資源,例如peer,peer group,管道,或是codat. 廣告是以XML文件的形式表現(xiàn)。
Identifiers(標(biāo)識(shí)符)
?? 在Jxta環(huán)境當(dāng)中,標(biāo)識(shí)符起到了非常關(guān)鍵的作用。Jxta使用標(biāo)識(shí)符來(lái)識(shí)別資源,而不是使用物理網(wǎng)絡(luò)地址。Jxta的標(biāo)識(shí)符被定義為URN(統(tǒng)一資源名(Uniform Resource Name))。一個(gè)URN本質(zhì)上就是一個(gè)URI(統(tǒng)一資源標(biāo)識(shí)符),這個(gè)URI在全局范圍內(nèi)唯一存在,并且即使資源已經(jīng)不在存在,但它的URI還是存在的。(請(qǐng)參看Resources獲取更多的資源)。
World peer group(世界對(duì)等點(diǎn)組)
每一個(gè)Jxta的Peer都缺省的屬于world peer group。任何一個(gè)Jxta的peer都內(nèi)在的屬于world peer group并能夠加入這個(gè)peer group。即使在peer無(wú)法在網(wǎng)絡(luò)上找到任何其它的peer的情況下,甚至在Peer沒(méi)有連接在網(wǎng)絡(luò)上的情況下所有的peer也都是屬于這個(gè)peer group的。
Net peer group(網(wǎng)絡(luò)對(duì)等點(diǎn)組)
在一個(gè)本地網(wǎng)絡(luò)中,網(wǎng)絡(luò)管理員可以創(chuàng)建一個(gè)任何peer都可以加入的peer group:這樣的peer group就是一個(gè)net peer group。這種group類似于DHCP服務(wù)。一個(gè)net peer group可以在管理員的限制下為peer提供全局接入的服務(wù)。
Rendezvous peers(集結(jié)點(diǎn))
一個(gè)Rendezvous peer 是一個(gè)通過(guò)緩存其它peer廣告的而保存有這些節(jié)點(diǎn)的信息的特殊peer。應(yīng)此,rendezvous電可以幫助其它的peer互相發(fā)現(xiàn)。Rendezvous peer點(diǎn)同樣可以將收到的發(fā)現(xiàn)請(qǐng)求信息(discovery request)轉(zhuǎn)發(fā)給其它的Rendezvous peer.
Endpoints (終結(jié)點(diǎn))
Endpoint是網(wǎng)絡(luò)的目的地節(jié)點(diǎn),它可以使用網(wǎng)絡(luò)地址來(lái)表示。Peers一般并不直接使用endpoint,它們間接的通過(guò)pipe來(lái)使用endpoint。Pipe是建立在endpoint之間的。
Routers(路由器)
如何將數(shù)據(jù)包在Jxta網(wǎng)絡(luò)上傳送的節(jié)點(diǎn)稱之為Jxta路由器。并不是所有的peer都需要成為一個(gè)路由器。任何不是路由器的peer都需要找到一個(gè)路由器來(lái)傳遞它們的消息。
Jxta 協(xié)議
Jxta的關(guān)鍵建立在由Jxta社區(qū)所指定的一系列通用協(xié)議之上。這些協(xié)議可以被用作應(yīng)用程序的基礎(chǔ)。這些協(xié)議被設(shè)計(jì)為低開(kāi)銷的,協(xié)議本身和使用它們的應(yīng)用程序所在的網(wǎng)絡(luò)拓樸環(huán)境是無(wú)關(guān)的。
Peer Discovery Protocol(PDP)對(duì)等點(diǎn)發(fā)現(xiàn)協(xié)議
Peer使用這個(gè)協(xié)議來(lái)發(fā)現(xiàn)被發(fā)布出來(lái)的Jxta資源。由于廣告就是代表著發(fā)布的資源,所以PDP的主要工作就是幫助peer來(lái)其它peer的廣告。作為最低級(jí)別的發(fā)現(xiàn)協(xié)議,PDP提供發(fā)現(xiàn)的最基本機(jī)制。應(yīng)用程序可以選擇使用其它更高級(jí)別的發(fā)現(xiàn)機(jī)制。PDP可以作為低基本的協(xié)議為其它高級(jí)別協(xié)議提供服務(wù)。
Peer Resolver Protocol(PRP) 對(duì)等點(diǎn)解析協(xié)議
在通常情況下,peer向其它peer發(fā)送查詢消息來(lái)定位服務(wù)或者內(nèi)容。Peer Resolver Protocol會(huì)將查詢的格式標(biāo)準(zhǔn)化。使用這個(gè)協(xié)議,peer可以發(fā)送通用的查詢并接收回復(fù)。
Peer Information Protocol(PIP)對(duì)等點(diǎn)信息協(xié)議
PIP可以被用來(lái)在Jxta環(huán)境中對(duì)一個(gè)peer發(fā)出ping消息。當(dāng)一個(gè)peer接收到一個(gè)peer消息的時(shí)候可以有幾種選擇:可以選給出一個(gè)簡(jiǎn)單的回復(fù),回復(fù)當(dāng)中僅包含peer的運(yùn)行時(shí)間。Peer也可以選擇發(fā)送一個(gè)完全的回復(fù),當(dāng)中包含它自身的廣告信息。或者它也可以選擇忽略這個(gè)ping消息。
Peer Membership Protocol(PMP)對(duì)等點(diǎn)成員協(xié)議
對(duì)等點(diǎn)使用對(duì)等點(diǎn)成員協(xié)議來(lái)加入和離開(kāi)peer group。這個(gè)協(xié)議識(shí)別peer使用的4個(gè)分散的步驟并為每一步的動(dòng)作定義的Jxta消息:
??????Apply:一個(gè)peer如果想加入一個(gè)group可以向這個(gè)group的成員驗(yàn)證者提過(guò)申請(qǐng)。
??????Join:在申請(qǐng)之后,peer可以選擇加入這個(gè)group
???????? Renew:如果要更新group的成員信息,peer可以使用renew的消息。
??????Cancel:peer可以選擇取消它在peer group中的成員資格。
Pipe Binding Protocol(PBP)管道綁定協(xié)議
在Jxta環(huán)境當(dāng)中,peer使用管道來(lái)連接服務(wù)。一個(gè)peer可以動(dòng)態(tài)的將綁定pipe的一端連接服務(wù)。Peer可以新建pipe,把它綁定到現(xiàn)存的pipe上,或是取消對(duì)pipe的綁定。在這些情況下,peer使用管道綁定協(xié)議。
Endpoint Routing Protocol (ERP) 終點(diǎn)路由協(xié)議
這個(gè)協(xié)議幫助peer將消息路由至目的地。ERP幫助peer 路由器查詢其它peer路由器用于傳遞消息的有效路由。
Jxta Java 綁定
觀察這些協(xié)議是怎樣工作的最好的辦法是了解一下Jxta Java 綁定,也就是Jxta的Java實(shí)現(xiàn)。開(kāi)發(fā)者選擇在現(xiàn)有的協(xié)議基礎(chǔ)上開(kāi)發(fā)應(yīng)用或是使用他們自己選擇的語(yǔ)言和平臺(tái)實(shí)現(xiàn)這些協(xié)議。盡管這種實(shí)現(xiàn)由于HTTP和TCP/IP的簡(jiǎn)單和流行性選擇了使用他們來(lái)進(jìn)行傳輸,但開(kāi)發(fā)者可以選擇耕具網(wǎng)絡(luò)拓樸狀況選擇任何傳輸協(xié)議來(lái)實(shí)現(xiàn)Jxta協(xié)議。
讓我們迅速的分析一下今天的Jxta Java 實(shí)現(xiàn)(由于本文寫在2001年,所以具體實(shí)現(xiàn)發(fā)現(xiàn)目前已經(jīng)有所變化。譯者注)
類組織:
???????? net.jxta.* 類
???????? net.jxta.impl.* 類
第一個(gè)包中包含了Jxta所有的接口,這些接口代表了Jxta的協(xié)議和核心模塊所提供的功能。第二個(gè)包中包含了這些接口的實(shí)現(xiàn)。接口和他們的實(shí)現(xiàn)必須被清晰的分開(kāi)。接下來(lái)我們深入看一些例子。
我的peer在哪里?
Peer是網(wǎng)絡(luò)上的一個(gè)獨(dú)立的,異步實(shí)體,它和一個(gè)peer ID關(guān)聯(lián)起來(lái)。你可以認(rèn)為一個(gè)代碼的運(yùn)行實(shí)例就是一個(gè)peer。目前,啟動(dòng)類(net.jxta.impl.peergroup.Boot)將會(huì)提供main()方法,啟動(dòng)以后將會(huì)成為一個(gè)peer。
一個(gè)peer擁有哪些能力取決于它屬于那個(gè)group。但是,作為一個(gè)基本的peer,它會(huì)擁有一些最基本的能力,比如說(shuō)它的ID。這也就是說(shuō),任何一個(gè)peer都必須處在一個(gè)peer group當(dāng)中:這個(gè)peer group叫做world peer group。也叫做platform peer group,world peer group由net.jxta.impl.peergroup.Platform表示,這個(gè)類是PeerGroup 類的一個(gè)實(shí)現(xiàn)(net.jxta.peergroup.PeerGroup)。
Peer group nesting (Peer group 嵌套)
假設(shè)有一個(gè)Peer P1,作為一個(gè)peer group PG1的成員,這個(gè)group提供一個(gè)基本的發(fā)現(xiàn)和查詢服務(wù)。現(xiàn)在假設(shè)網(wǎng)絡(luò)中存在另一個(gè)peer group,PG2, 提供更加強(qiáng)大的搜索服務(wù)。P1如果想要使用這種服務(wù)就必須加入PG2當(dāng)中去,但它可以同時(shí)使用PG1所提供的搜索服務(wù)。要實(shí)現(xiàn)這個(gè)功能,我們可以使用Peer group嵌套。通過(guò)Peer group嵌套,一個(gè)peer group提供的服務(wù)即使在被其它的peer group重載的情況下,也可以被使用。它提供了一種繼承關(guān)系:第一個(gè)peer group,PG1,在這里作為一個(gè)父組,PG2作為一個(gè)孩子組。在這種情況下,孩子組的服務(wù)覆蓋了父組的服務(wù)。也就是說(shuō),一但P1加入了PG2,這種繼承關(guān)系就變?yōu)閃orldPeerGroup/PG1/PG2。請(qǐng)注意到World Peer Group總是處在這種層次關(guān)系的最高端,是所有的Peer缺省處于的group。
作為應(yīng)用程序的Peer group
作為綁定的一種重要的抽象,一個(gè)應(yīng)用(net.jxta.platform.Application)是一個(gè)可以由peer group初始化,啟動(dòng)和停止的東西。有意思的是一個(gè)peer group由于應(yīng)用的原因(net.jxta.peergroup.PeerGroup)經(jīng)常會(huì)啟動(dòng)其它的peer group(如果peer group 嵌套的討論)。World peer group是一個(gè)例外。它作為peer group層次關(guān)系的基礎(chǔ),并不會(huì)啟動(dòng)其它任何的peer group。一個(gè)應(yīng)用定義了三個(gè)方法:init(), startApp(), and stopApp()。
在一個(gè)Application 類中的這些方法如下所示:
public void init(PeerGroup group, Advertisement adv);
public int startApp(String[] args);
public void stopApp();
管道和邊界節(jié)點(diǎn)(pipes and endpoints)
像我們?cè)缦忍岬降哪菢樱琾ipe是Jxta環(huán)境中用來(lái)進(jìn)行消息傳輸?shù)奶摂M管道。Pipe由Pipe接口表示(net.jxta.pipe.Pipe),作為一種繼承自Service (net.jxta.service.Service).接口的服務(wù)。Pipe被進(jìn)一步的劃分為輸入管道(net.jxta.pipe.InputPipe)和輸出管道(net.jxta.pipe.OutputPipe).PipeService 類(net.jxta.impl.pipe.PipeService)包含了使用綁定的pipe實(shí)現(xiàn)。
Pipe是建在在終端節(jié)點(diǎn)(endpoint)之上的。Endpoint類,net.jxta.impl.endpoint.Endpoint,是一個(gè)傳輸終結(jié)點(diǎn)的集合。Endpoint即可以使用propagate()方法來(lái)發(fā)送消息或是利用終結(jié)點(diǎn)消息實(shí)現(xiàn)(net.jxta.impl.endpoint.EndpointMessenger)來(lái)將消息發(fā)送到一個(gè)指定的終結(jié)點(diǎn)。這種終結(jié)點(diǎn)消息實(shí)現(xiàn)取決于具體的它所實(shí)現(xiàn)的傳輸協(xié)議的情況。舉例來(lái)說(shuō),net.jxta.impl.endpoint.http.HttpNonBlockingMessenger類就是將終結(jié)點(diǎn)傳輸實(shí)現(xiàn)建立在HTTP協(xié)議的基礎(chǔ)上的。
廣告(Advertisements)
所有的廣告都是從抽象超類Advertisement(net.jxta.document.Advertisement)繼承下來(lái)的。由廣告具體所代表的資源,我們可以將廣告進(jìn)一步劃分為peer group廣告(net.jxta.protocol.PeerGroupAdvertisement),管道廣告(net.jxta.protocol.PipeAdvertisement),等等。廣告由一個(gè)AdvertisementFactory 類 (net.jxta.document.AdvertisementFactory)創(chuàng)建。使用工廠方法有助于隱藏廣告的內(nèi)部實(shí)現(xiàn)。
服務(wù)(Services)
所有的服務(wù)都實(shí)現(xiàn)了Service 接口(net.jxta.service.Service)。服務(wù)是一個(gè)擴(kuò)展了Application接口的應(yīng)用。由于服務(wù)對(duì)象并不能夠直接被操縱,所以通常都使用Service接口訪問(wèn)Service 對(duì)象。舉例來(lái)說(shuō),Discovery接口 (net.jxta.discovery.Discovery) 代表 Discovery 服務(wù)。DiscoveryServic類(net.jxta.impl.discovery.DiscoveryService) 代表Discovery Service的實(shí)現(xiàn)。DiscoveryService類并不能夠被直接訪問(wèn),而需要使用DiscoveryInterface接口來(lái)訪問(wèn)。(net.jxta.impl.discovery.DiscoveryInterface).
Jxta community projects(Jxta社區(qū)工程)
我們已經(jīng)提到過(guò),Jxta是一個(gè)由開(kāi)源開(kāi)發(fā)者,技術(shù)狂熱者和學(xué)術(shù)研究者參加的社區(qū)推動(dòng)的工程。任何人都可以加入工程,并做出自己的貢獻(xiàn)。Jxta.org 提出了一些很有意思的工程。我們來(lái)了解其中的幾個(gè)。
The Jxta Shell
Jxta shell是一個(gè)建立在Jxta的Java實(shí)現(xiàn)上的范例應(yīng)用程序。它以命令行方式為用戶提供了一種互動(dòng)接入方式到的Jxta。Jxta shell使用和Unix相似的界面并提供相似的命令幫助用戶使用Jxta的源語(yǔ)。用戶可以從shell homepage下載到Jxta Shell,它可以很容易的安裝和配置。Jxta的Shell命令和Unix的命令很想象。并且支持管道操作符(|)
在Jxta shell當(dāng)中,大部分的命令都可以被動(dòng)態(tài)的加載和激活,命令的加載與平臺(tái)框架相對(duì)獨(dú)立。這就給了開(kāi)發(fā)者一種方便的途徑,在shell當(dāng)中加入自己的命令。我們?cè)谶@里列出一些基本的內(nèi)嵌shell指令:
Man
?? Man命令是Jxta的shell的幫助系統(tǒng)。使用這個(gè)命令可以列出當(dāng)前的Jxta Shell當(dāng)中所有可用的命令列表。如果需要查詢某個(gè)特定命令的的幫助信息時(shí),可以使用<command name>參數(shù)
Clear:
?? 將shell的屏幕清空
Env:
?? Env命令將當(dāng)前shell 會(huì)話的環(huán)境變量顯示出來(lái)。缺省定義有七個(gè)環(huán)境變量:
1.????????consin:缺省控制臺(tái)輸入管道
2.????????consout:缺省控制臺(tái)輸出管道
3.????????stdin:缺省輸入管道
4.????????stdout:缺省輸出管道
5.????????stdgroup:缺省peer group
6.????????rootgroup:缺省 net peer group
7.????????shell:根shell(root shell)
setenv:
設(shè)置一個(gè)shell環(huán)境變量
Cat:
???? 使用cat命令可以打印出一個(gè)Jxta對(duì)象的內(nèi)容
Whoami
???? 顯示出一個(gè)peer或者peer group的信息。如果沒(méi)有加參數(shù)的話,顯示出的是本地的peer信息。
Rdvstatus
???? 顯示出peer當(dāng)前所連接的所有的rendezvous peer。同時(shí)也顯示出當(dāng)前peer是否是一個(gè)rendezvous peer。
Peers
使用peers命令用于發(fā)現(xiàn)處在同一個(gè)peer group中的其它peer。如果不加參數(shù)就會(huì)列出當(dāng)前peer的所有已知peer。這是應(yīng)為所有被shell發(fā)現(xiàn)的廣告信息都被緩存在了本地。使用-r參數(shù)將會(huì)清除保存在緩存中的peer廣告信息。
Groups
?? Groups命令類似于peers命令;用于發(fā)現(xiàn)peer groups。
Importfile
??將一個(gè)外部文件導(dǎo)入shell的環(huán)境變量
Exportfile
?? 將環(huán)境變量導(dǎo)出到一個(gè)文件中。
Mkadv
?? 使用mkadv命令將會(huì)根據(jù)shell環(huán)境變量信息生成一個(gè)廣告。廣告可以是peer group廣告也可以是管道廣告。
Mkpgrp
Mkpgrp命令將會(huì)使用peer 廣告創(chuàng)建一個(gè)新的peer group。如果沒(méi)有指定廣告,shell將會(huì)創(chuàng)建一個(gè)net peer group的克隆。
Join
?? 使用join命令可以把peer將如到一個(gè)peer group當(dāng)中
Leave
?? 使用leave命令可以使一個(gè)先前使用join命令加入peer group當(dāng)中的peer退出該peer group
Mkpipe
??使用mkpipe命令將會(huì)傳見(jiàn)一個(gè)輸入或者輸出管道。管道從一個(gè)本地的輸入管道廣告文件創(chuàng)立。
Talk
?? 使用talk命令可以在兩個(gè)遠(yuǎn)程peer之間進(jìn)行簡(jiǎn)單的,最小化的即時(shí)消息會(huì)話。它包括三個(gè)步驟。第一,用戶注冊(cè),主要包括為那個(gè)用戶創(chuàng)建一個(gè)新的talk廣告,這是一個(gè)one-time過(guò)程。用戶注冊(cè)是使用talk -register <nick>命令實(shí)現(xiàn)的。其次,一旦注冊(cè)完成,用戶可以登入并開(kāi)始交談。用戶使用talk -login <nick>命令進(jìn)行登陸。用戶還可以通過(guò)talk -search命令來(lái)搜索其它的用戶。第三,一旦定位到另一位用戶,當(dāng)前用戶可以使用talk -u <nick> <destinationUserName>來(lái)發(fā)送消息。
Exit
??使用exit命令退出shell
Jxta 內(nèi)容管理服務(wù)(The Jxta Content Manager Service)
Jxta 內(nèi)容管理服務(wù)(通常稱為CMS)用來(lái)幫助用戶在一個(gè)peer group當(dāng)中共享與獲取由一個(gè)全局唯一的cotent ID所代表的內(nèi)容。CMS同時(shí)也將內(nèi)容通過(guò)元數(shù)據(jù)的形勢(shì)表現(xiàn)出來(lái)。更進(jìn)一部 ,CMS幫助用戶對(duì)本地的內(nèi)容進(jìn)行管理,并允許用戶通過(guò)它們?yōu)g覽和下載其它遠(yuǎn)程peer的內(nèi)容。
InstantP2P
InstantP2Pshi 是一個(gè)建立在jxta之上的peer-to-peer即時(shí)消息服務(wù)。它在功能上包括一對(duì)一的即時(shí)消息,群體聊天,文件共享等功能。它可以工作在Linux, Solaris,Win32等多種平臺(tái)之上。使用Personal Java 3.1的設(shè)備也可以支持InstantP2P。
InstantP2P可以做為學(xué)習(xí)Jxta的一個(gè)良好范例。用戶可以使用自己選擇的昵稱登陸進(jìn)入這個(gè)應(yīng)用程序。之后就可以搜尋所有在網(wǎng)絡(luò)上可用的Jxta Group并選擇加入它們。用戶可以看到所以的group成員。使用chat選項(xiàng)來(lái)進(jìn)行一對(duì)一的聊天,使用group chant進(jìn)行群聊。使用share選項(xiàng)用戶可以在group成員之間共享內(nèi)容。用戶也能夠搜索group中的共享內(nèi)容。InstantP2P內(nèi)部使用內(nèi)容管理服務(wù)來(lái)管理文件共享。
Jxta的未來(lái)
在這篇文章中,我向大家介紹了peer-to-peer網(wǎng)絡(luò)。通過(guò)這些用戶可以發(fā)現(xiàn)Jxta給P2P世界所提供的功能。我也為大家介紹了在創(chuàng)建基于Jxta的應(yīng)用的時(shí)候一些重要的術(shù)語(yǔ)和概念。
Jxta將會(huì)成為P2P應(yīng)用的地層開(kāi)發(fā)平臺(tái)。現(xiàn)在的Jxta還處在初級(jí)階段,未來(lái)它會(huì)逐漸成熟提供一個(gè)強(qiáng)壯的,可靠的框架給P2P計(jì)算。由于Java是構(gòu)建異構(gòu)環(huán)境下應(yīng)用的首選所以它也是建立P2P應(yīng)用的自然選擇。我希望這篇文章能夠帶給您啟發(fā),幫助您開(kāi)始探索Jxta和P2P世界。
作者簡(jiǎn)介:
Navaneeth Krishnan是Aztec Software and Technology Solutions的資深產(chǎn)品工程師,曾為用戶開(kāi)發(fā)過(guò)多個(gè)電子商務(wù)解決方案和框架。他也是一位狂熱的P2P技術(shù)愛(ài)好者,對(duì)Jxta有深入的研究。他的Jxta社區(qū)項(xiàng)目iPeers,用來(lái)集成在P2P網(wǎng)絡(luò)中的人工智能。
資源列表:
Jxta工程主頁(yè)
http://www.jxta.org
Jxta協(xié)議細(xì)節(jié)及白皮書
http://www.jxta.org/white_papers.html
The Jxta shell 工程主頁(yè)
http://shell.jxta.org
The CMS 主頁(yè)
http://cms.jxta.org
The InstantP2P主頁(yè)
http://instantp2p.jxta.org/
如果想要了解更多的關(guān)于Gnutella網(wǎng)絡(luò)的擴(kuò)展性問(wèn)題,????????請(qǐng)閱讀"Bandwidth Barriers to Gnutella Network Scalability" (Clip2, September 2000)一文:
http://www.clip2.com/dss_barrier.html
了解更多關(guān)于URIs,URLs,和URNs的知識(shí)
http://www.ietf.org/rfc/rfc2396.txt
"The Gnutella File-Sharing Network and Java," “Gnutella文件共享網(wǎng)絡(luò)與Java”Ken McCrary (JavaWorld, October 2000):
http://www.javaworld.com/javaworld/jw-10-2000/jw-1006-fileshare.html
Mark Johnson 在JavaOne 2001對(duì)于創(chuàng)建新的P2P協(xié)議動(dòng)機(jī)所做的報(bào)告"Get Connected with Jxta" (JavaWorld, June 2001):
http://www.javaworld.com/javaworld/javaone01/j1-01-jxta.html
更多的關(guān)于企業(yè)級(jí)Java,????????請(qǐng)瀏覽JavaWorld的標(biāo)????????題索引:
http://www.javaworld.com/channel_content/jw-enterprise-index.shtml
訂閱JavaWorld’s每周免費(fèi)新聞郵件
http://www.idg.net/jw-subscribe
jwebee
我的個(gè)人網(wǎng)站