一、 引言
最近幾年,對(duì)等式網(wǎng)絡(luò)模型P2P開(kāi)始受到重視,成為最近的技術(shù)熱點(diǎn)。P2P即Peer to Peer,稱(chēng)為對(duì)等連接或?qū)Φ染W(wǎng)絡(luò),它與傳統(tǒng)的客戶(hù)端/服務(wù)器(C/S)或?yàn)g覽器/服務(wù)器(B/S)模式相比,最大的不同是降低了對(duì)服務(wù)器的依賴(lài),在P2P網(wǎng)絡(luò)中各Peer之間的關(guān)系是對(duì)等的,Peer同時(shí)具有Client和Server的特點(diǎn)。它們可以直接通信,進(jìn)行文件傳輸,無(wú)需依賴(lài)集中式服務(wù)器或資源就可完成。
P2P技術(shù)將在網(wǎng)絡(luò)尤其是寬帶網(wǎng)絡(luò)方面具備強(qiáng)大的應(yīng)用潛力,2002 legend world大會(huì)上中科院計(jì)算機(jī)所的李國(guó)杰所長(zhǎng)對(duì)P2P技術(shù)與網(wǎng)格技術(shù)的融和做出了非常有遠(yuǎn)見(jiàn)的預(yù)測(cè),國(guó)外P2P網(wǎng)絡(luò)流量占據(jù)了整個(gè)網(wǎng)絡(luò)流量的40%,國(guó)外P2P網(wǎng)絡(luò)注冊(cè)用戶(hù)超過(guò)3億以上這些都是有力的證據(jù),從試驗(yàn)科學(xué)的角度來(lái)看,P2P技術(shù)是因?yàn)榻鉀Q了互聯(lián)網(wǎng)模型中的弱鏈接模塊的信息傳遞這個(gè)障礙,使得互聯(lián)網(wǎng)的信息流動(dòng)更加通暢才使他具備了這樣強(qiáng)大的生命力和應(yīng)用前景。
目前,P2P 技術(shù)的應(yīng)用主要是在文件共享和即時(shí)通訊方面這兩個(gè)方面。所謂即時(shí)通訊,其實(shí)指的就是諸如OICQ、ICQ等被稱(chēng)為在線(xiàn)聊天的軟件。從某種意義上說(shuō),由于版 權(quán)的限制,即時(shí)通訊應(yīng)用將超過(guò)文件共享應(yīng)用,成為P2P的第一大應(yīng)用。我基于JXTA(JXTA將在第二節(jié)作詳細(xì)介紹)設(shè)計(jì)了一個(gè)簡(jiǎn)單的P2P即時(shí)通信系統(tǒng),它可以實(shí)現(xiàn)互聯(lián)網(wǎng)上任意兩臺(tái)主機(jī)之間的直接連接,不僅可以隨時(shí)知曉對(duì)方在線(xiàn)與否,而且交流雙方的通訊完全是點(diǎn)對(duì)點(diǎn)進(jìn)行,不依賴(lài)服務(wù)器的性能和網(wǎng)絡(luò)帶寬,它為開(kāi)發(fā)更多的P2P應(yīng)用提供了基礎(chǔ)。由于Java為網(wǎng)絡(luò)編程提供了很好的支持和優(yōu)化,并且是跨平臺(tái)的,可移植性好,因此,我們選用Java作為開(kāi)發(fā)語(yǔ)言。
二、 JXTA簡(jiǎn)介
由于P2P應(yīng)用軟件的前景看好,各大軟件公司都在競(jìng)相開(kāi)發(fā)P2P的軟件開(kāi)發(fā)產(chǎn)品,Sun的JXTA就是其中的一個(gè)。使用JXTA開(kāi)發(fā)技術(shù),軟件開(kāi)發(fā)人員可以開(kāi)發(fā)出基于Java語(yǔ)言的P2P的應(yīng)用軟件。JXTA技術(shù)是一組開(kāi)發(fā)式的協(xié)議,它們能夠連接網(wǎng)絡(luò)中的任何設(shè)備,從手提電話(huà)、無(wú)線(xiàn)PDA到臺(tái)式電腦,讓它們協(xié)同工作、共享資源。JXTA網(wǎng)絡(luò)里面的全部結(jié)點(diǎn)共同組成了一個(gè)虛擬網(wǎng)絡(luò),里面的任何一個(gè)結(jié)點(diǎn)都能直接訪(fǎng)問(wèn)其他的結(jié)點(diǎn),即使那些結(jié)點(diǎn)是位于防火墻的背后。
1、 使用JXTA技術(shù)來(lái)開(kāi)發(fā)分布式計(jì)算軟件,可以實(shí)現(xiàn)以下功能:
(1) 能夠直接跟防火墻之后的其他結(jié)點(diǎn)連接;
(2) 簡(jiǎn)易的共享文檔資料;
(3) 得到網(wǎng)絡(luò)上包含的信息的簡(jiǎn)要目錄;
(4) 建立結(jié)點(diǎn)群組來(lái)提供定制的服務(wù);
可以在遠(yuǎn)端監(jiān)視某個(gè)結(jié)點(diǎn)的行為。
2、 JXTA的軟件結(jié)構(gòu)分為以下三層(如圖1所示)
(1)核心層(JXTA Core):它包含了服務(wù)所需要的核心功能,這一層封裝了最根本的東西,包括Peer、對(duì)等組、Peer發(fā)現(xiàn)、Peer通信、Peer監(jiān)視和相關(guān)的安全原語(yǔ)。
(2)服務(wù)層(JXTA Service):它提供了訪(fǎng)問(wèn)JXTA協(xié)議的接口,這一層包括了對(duì)于P2P網(wǎng)絡(luò)不是必需的、但很通用的功能,如查找、共享、索引、代碼緩存和內(nèi)容緩存的機(jī)制。
(3)應(yīng)用層(JXTA Application):它使用服務(wù)來(lái)訪(fǎng)問(wèn)JXTA網(wǎng)絡(luò)和JXTA提供的功能。這一層包括了應(yīng)用JXTA服務(wù)卡發(fā)出來(lái)的完整的P2P應(yīng)用程序,例如myJXTA ,JXTA-CAD等應(yīng)用程序。
圖1 JXTA的層次結(jié)構(gòu)三、 結(jié)構(gòu)設(shè)計(jì)
1、 總體介紹
本系統(tǒng)是一個(gè)建立在基于JXTA的P2P網(wǎng)絡(luò)之上的即時(shí)通信軟件,它的功能類(lèi)似于我們目前常常用到的即時(shí)通信軟件,如OICQ、ICQ和MSN等。即時(shí)通信系統(tǒng)分為發(fā)送(sender)、中繼轉(zhuǎn)發(fā)(transfer)和接收(receiver)三部分。當(dāng)transfer啟動(dòng)時(shí)加入P2P網(wǎng)絡(luò),并且在P2P網(wǎng)絡(luò)中發(fā)布提供即時(shí)通信服務(wù)的通告。Sender加入P2P網(wǎng)絡(luò),通過(guò)查找P2P網(wǎng)絡(luò)通告尋找提供服務(wù)的transfer,選擇transfer形成P2P網(wǎng)絡(luò)通道。Sender在這個(gè)通道基礎(chǔ)上建立與目的端的SOCKET連接,將信息傳遞到receiver。傳遞的信息是用XML形式封裝的字節(jié)數(shù)組,數(shù)據(jù)被保存在XML文件中,由transfer解析出數(shù)據(jù)。通過(guò)通道中的各個(gè)transfer對(duì)信息進(jìn)行加密及解密操作,實(shí)現(xiàn)sender和receiver之間的通信。當(dāng)用戶(hù)運(yùn)行該軟件時(shí),會(huì)出現(xiàn)登陸界面,如圖2所示,如果用戶(hù)是第一次運(yùn)行該程序,并沒(méi)有任何默認(rèn)的設(shè)置,JXTA會(huì)彈出JXTA GUI 配置實(shí)用程序讓你進(jìn)行一些強(qiáng)制的和可選的設(shè)置。當(dāng)用戶(hù)輸入正確的用戶(hù)名和密碼之后,就會(huì)加入JXTA網(wǎng)絡(luò),并啟動(dòng)本機(jī)的JXTA服務(wù),成為JXTA網(wǎng)絡(luò)中的一個(gè)Peer。
圖2系統(tǒng)通信過(guò)程示意圖如圖2所示,A、B、P1、P2……P5都是存在于基于JXTA的P2P網(wǎng)絡(luò)中的Peer,其中的A希望與B建立連接進(jìn)行通信,而B(niǎo)收到A發(fā)出的Advertisement并對(duì)其進(jìn)行驗(yàn)證,當(dāng)驗(yàn)證通過(guò),則A與B之間建立Pipe,進(jìn)行消息的傳遞。
2、 層次結(jié)構(gòu)
系統(tǒng)主要分成三個(gè)部分:
l P2P網(wǎng)絡(luò)中的中繼轉(zhuǎn)發(fā)部分(transfer)
l 系統(tǒng)的發(fā)送部分(sender)
l 系統(tǒng)的接收部分(receiver)
(1)中繼轉(zhuǎn)發(fā)部分(transfer)
Transfer主要負(fù)責(zé)提供匿名通信的服務(wù),接收sender不同類(lèi)型的消息,對(duì)其信息進(jìn)行解密操作并且傳遞到JXTA網(wǎng)絡(luò)中下一個(gè)Peer的transfer,如果是最終結(jié)點(diǎn)PEER就首先建立與receiver的連接,然后將信息解密之后,再解析XML文件得到數(shù)據(jù)傳遞到receiver。然后再接收receiver不同類(lèi)型的消息,對(duì)其信息進(jìn)行加密操作并且傳遞到下一個(gè)Peer的transfer ,直到傳回到sender。在sender請(qǐng)求建立通道時(shí),必須根據(jù)sender 請(qǐng)求信息判斷這個(gè)transfer是作為中間結(jié)點(diǎn)處理數(shù)據(jù)還是作為最終結(jié)點(diǎn)處理數(shù)據(jù),兩者的處理信息方式有很大區(qū)別。如果信息傳遞過(guò)程中出現(xiàn)問(wèn)題,將出錯(cuò)信息傳回receiver。
(2)發(fā)送部分(sender)
sender主要負(fù)責(zé)查找JXTA網(wǎng)絡(luò)中提供匿名通信服務(wù)的transfer,通過(guò)找到的transfer建立起一條基于P2P網(wǎng)絡(luò)的通道,然后就可以在這條通道上建立每一個(gè)SOCKET通話(huà)連接,這樣通過(guò)這條通道就可以傳遞不同類(lèi)型的信息(請(qǐng)求建立通道、數(shù)據(jù)、請(qǐng)求結(jié)束通話(huà)、請(qǐng)求關(guān)閉通道、建立通道允許、結(jié)束通話(huà)允許、關(guān)閉通道允許以及出錯(cuò)信息)。在接收到receiver傳遞過(guò)來(lái)的信息時(shí),由于經(jīng)過(guò)加密得到的是密文,必須按照建立的P2P網(wǎng)絡(luò)路徑的順序進(jìn)行解密,才能得到所需要的明文數(shù)據(jù)。在傳遞信息時(shí),把需要傳遞的信息封裝成XML的格式,這樣在需要使用這些信息的transfer上就可以解析出所需要的數(shù)據(jù),以便于進(jìn)行下一步的操作。
(3)接收部分(receiver)
receiver主要負(fù)責(zé)在接收到P2P網(wǎng)絡(luò)中的transfer傳遞過(guò)來(lái)時(shí)的SOCKET連接請(qǐng)求時(shí)同意SOCKET連接,列出和自己建立連接的sender,通過(guò)選擇sender進(jìn)行基于P2P網(wǎng)絡(luò)的信息傳遞。在接收到P2P網(wǎng)絡(luò)中的transfer傳遞過(guò)來(lái)時(shí)的SOCKET通話(huà)結(jié)束請(qǐng)求時(shí)關(guān)閉SOCKET連接,同時(shí)取消在列表中的sender,這樣receiver就無(wú)法與結(jié)束通話(huà)的sender再次取得聯(lián)系。在receiver關(guān)閉時(shí),必須通知所有已經(jīng)與自己連接的sender,sender才可以關(guān)閉與這個(gè)receiver的連接。
3、 具體實(shí)現(xiàn)及代碼分析
由于篇幅所限,在本文中我只對(duì)系統(tǒng)中的中繼轉(zhuǎn)發(fā)部分進(jìn)行介紹。
Transfer部分主要包括如下幾個(gè)重要的類(lèi):
(1)TRANSFER.CLASS
該類(lèi)主要是繼承了SERVERSOCKET類(lèi),SERVERSOCKET類(lèi)是用來(lái)寫(xiě)服務(wù)器程序的類(lèi),所謂服務(wù)器程序,通常會(huì)監(jiān)聽(tīng)某一個(gè)連接端口,如果有某一臺(tái)客戶(hù)端計(jì)算機(jī)發(fā)出聯(lián)機(jī)的請(qǐng)求,則服務(wù)器就必須做出一些反應(yīng)。TRANSFER.CLASS除了繼承了SERVERSOCKET的創(chuàng)建服務(wù)器監(jiān)聽(tīng)端口,接受連接,關(guān)閉連接的功能之外,還定義了自己的功能函數(shù)——transnext(),與下一個(gè)P2P網(wǎng)絡(luò)結(jié)點(diǎn)PEER
建立連接。
(2)NEWMSG.CLASS和PARSEMSG.CLASS
在信息傳遞的過(guò)程中,所有的數(shù)據(jù)都是以XML文件格式封裝的,將整個(gè)XML文件格式的信息作為整個(gè)字節(jié)數(shù)組byte[]進(jìn)行加密和解密,在需要的結(jié)點(diǎn)PEER將字節(jié)數(shù)組的內(nèi)容寫(xiě)入到XML文件中,再使用XML的解析方法將需要的數(shù)據(jù)解析出來(lái)。關(guān)于XML文件部分的操作主要由NEWMSG.CLASS和PARSEMSG.CLASS完成,其中NEWMSG.CLASS主要是將收到的信息保存到XML文件中,而PARSEMSG.CLASS主要是解析出XML文件中需要的數(shù)據(jù)。
(3)JXTASHELL.CLASS
JXTASHELL.CLASS主要是使用JXTA創(chuàng)建P2P網(wǎng)絡(luò)中的點(diǎn)組,初始化點(diǎn)組,創(chuàng)建通告,發(fā)布通告。這個(gè)CLASS文件對(duì)搭建P2P網(wǎng)絡(luò)起了主要的作用。
下面是部分源代碼:
public void workdealwith(String m,String de){ //解析XML文件元素
try{
DOMParser parser=new DOMParser();
parser.parse(m+“.xml”); //取得需要解析的XML文件
Document dom=parser.getDocument(); //dom為結(jié)點(diǎn)樹(shù)的根結(jié)點(diǎn)
NodeList games=dom.getElementsByTagName(de); //取得需要解析的元素
for (int i=0;iNode anode=games.item(i);
NamedNodeMap attributes=anode.getAttributes();
contest=anode.getFirstChild().getNodeValue(); //得到元素de的值
for (int a=0;aNode theattribute=attributes.item(a); //取得元素de的屬性
type=theattribute.getNodeValue(); //得到元素de的屬性的值
}
}
}catch(Exception e){}
}
四、 結(jié)束語(yǔ)
本文作者的創(chuàng)新點(diǎn)主要在于在JXTA架構(gòu)的基礎(chǔ)上構(gòu)建一個(gè)P2P的即時(shí)通信息通。利用P2P非中心性和動(dòng)態(tài)性的特征為即時(shí)通信服務(wù),在即時(shí)通信的過(guò)程中,在發(fā)送端對(duì)消息進(jìn)行加密,在接收端再對(duì)加密的消息解密,消息在JXTA網(wǎng)絡(luò)中是以匿名方式的方式進(jìn)行傳輸?shù)模箶?shù)據(jù)傳輸更加安全。傳遞的信息是用XML形式封裝的字節(jié)數(shù)組,數(shù)據(jù)被保存在XML文件中,由transfer解析出數(shù)據(jù)。通過(guò)通道中的各個(gè)transfer對(duì)信息進(jìn)行加密及解密操作,實(shí)現(xiàn)客戶(hù)端和目的端之間的匿名通信。在系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)過(guò)程中,對(duì)XML文件格式、JXTA技術(shù)、加密解密技術(shù)等等做了一定的了解。但是由于時(shí)間倉(cāng)促,且實(shí)驗(yàn)條件的限制,程序的在穩(wěn)定性方面仍然存在一定的問(wèn)題,這有待于進(jìn)一步開(kāi)發(fā)和完善。
責(zé)任編輯:gt
-
互聯(lián)網(wǎng)
+關(guān)注
關(guān)注
54文章
11115瀏覽量
103032 -
通信系統(tǒng)
+關(guān)注
關(guān)注
6文章
1176瀏覽量
53290 -
JAVA
+關(guān)注
關(guān)注
19文章
2960瀏覽量
104562
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論