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