新聞中心

EEPW首頁 > 消費(fèi)電子 > 設(shè)計應(yīng)用 > 基于JXTA的P2P即時通信系統(tǒng)設(shè)計

基于JXTA的P2P即時通信系統(tǒng)設(shè)計

——
作者:符巍 鄭雪峰 時間:2007-01-26 來源:《EDN電子設(shè)計技術(shù)》 收藏

一、 引言

本文引用地址:http://m.butianyuan.cn/article/21502.htm

最近幾年,對等式網(wǎng)絡(luò)模型p2p開始受到重視,成為最近的技術(shù)熱點(diǎn)。p2p即peer to peer,稱為對等連接或?qū)Φ染W(wǎng)絡(luò),它與傳統(tǒng)的客戶端/服務(wù)器(c/s)或?yàn)g覽器/服務(wù)器(b/s)模式相比,最大的不同是降低了對服務(wù)器的依賴,在p2p網(wǎng)絡(luò)中各peer之間的關(guān)系是對等的,peer同時具有client和server的特點(diǎn)。它們可以直接通信,進(jìn)行文件傳輸,無需依賴集中式服務(wù)器或資源就可完成。

p2p技術(shù)將在網(wǎng)絡(luò)尤其是寬帶網(wǎng)絡(luò)方面具備強(qiáng)大的應(yīng)用潛力,2002 legend world大會上中科院計算機(jī)所的李國杰所長對p2p技術(shù)與網(wǎng)格技術(shù)的融和做出了非常有遠(yuǎn)見的預(yù)測,國外p2p網(wǎng)絡(luò)流量占據(jù)了整個網(wǎng)絡(luò)流量的40%,國外p2p網(wǎng)絡(luò)注冊用戶超過3億以上這些都是有力的證據(jù),從試驗(yàn)科學(xué)的角度來看,p2p技術(shù)是因?yàn)榻鉀Q了互聯(lián)網(wǎng)模型中的弱鏈接模塊的信息傳遞這個障礙,使得互聯(lián)網(wǎng)的信息流動更加通暢才使他具備了這樣強(qiáng)大的生命力和應(yīng)用前景。

目前,p2p 技術(shù)的應(yīng)用主要是在文件共享和即時通訊方面這兩個方面。所謂即時通訊,其實(shí)指的就是諸如oicq、icq等被稱為在線聊天的軟件。從某種意義上說,由于版

權(quán)的限制,即時通訊應(yīng)用將超過文件共享應(yīng)用,成為p2p的第一大應(yīng)用。我基于jxta(jxta將在第二節(jié)作詳細(xì)介紹)設(shè)計了一個簡單的p2p 即時通信系統(tǒng),它可以實(shí)現(xiàn)互聯(lián)網(wǎng)上任意兩臺主機(jī)之間的直接連接,不僅可以隨時知曉對方在線與否,而且交流雙方的通訊完全是點(diǎn)對點(diǎn)進(jìn)行,不依賴服務(wù)器的性能和網(wǎng)絡(luò)帶寬,它為開發(fā)更多的p2p應(yīng)用提供了基礎(chǔ)。由于java為網(wǎng)絡(luò)編程提供了很好的支持和優(yōu)化,并且是跨平臺的,可移植性好,因此,我們選用java作為開發(fā)語言。

二、 jxta簡介

由于p2p應(yīng)用軟件的前景看好,各大軟件公司都在競相開發(fā)p2p的軟件開發(fā)產(chǎn)品,sun的jxta就是其中的一個。使用jxta開發(fā)技術(shù),軟件開發(fā)人員可以開發(fā)出基于java語言的p2p的應(yīng)用軟件。jxta技術(shù)是一組開發(fā)式的協(xié)議,它們能夠連接網(wǎng)絡(luò)中的任何設(shè)備,從手提電話、無線pda到臺式電腦,讓它們協(xié)同工作、共享資源。jxta網(wǎng)絡(luò)里面的全部結(jié)點(diǎn)共同組成了一個虛擬網(wǎng)絡(luò),里面的任何一個結(jié)點(diǎn)都能直接訪問其他的結(jié)點(diǎn),即使那些結(jié)點(diǎn)是位于防火墻的背后。

1、 使用jxta技術(shù)來開發(fā)分布式計算軟件,可以實(shí)現(xiàn)以下功能:

(1) 能夠直接跟防火墻之后的其他結(jié)點(diǎn)連接;

(2) 簡易的共享文檔資料;

(3) 得到網(wǎng)絡(luò)上包含的信息的簡要目錄;

(4) 建立結(jié)點(diǎn)群組來提供定制的服務(wù);

可以在遠(yuǎn)端監(jiān)視某個結(jié)點(diǎn)的行為。

2、 jxta的軟件結(jié)構(gòu)分為以下三層(如圖1所示)

(1)核心層(jxta core):它包含了服務(wù)所需要的核心功能,這一層封裝了最根本的東西,包括peer、對等組、peer發(fā)現(xiàn)、peer通信、peer監(jiān)視和相關(guān)的安全原語。

(2)服務(wù)層(jxta service):它提供了訪問jxta協(xié)議的接口,這一層包括了對于p2p網(wǎng)絡(luò)不是必需的、但很通用的功能,如查找、共享、索引、代碼緩存和內(nèi)容緩存的機(jī)制。

(3)應(yīng)用層(jxta application):它使用服務(wù)來訪問jxta網(wǎng)絡(luò)和jxta提供的功能。這一層包括了應(yīng)用jxta服務(wù)卡發(fā)出來的完整的p2p應(yīng)用程序,例如myjxta ,jxta-cad等應(yīng)用程序。


圖1 jxta的層次結(jié)構(gòu) 三、 結(jié)構(gòu)設(shè)計

1、 總體介紹

本系統(tǒng)是一個建立在基于jxta的p2p網(wǎng)絡(luò)之上的即時通信軟件,它的功能類似于我們目前常常用到的即時通信軟件,如oicq、icq和msn等。即時通信系統(tǒng)分為發(fā)送(sender)、中繼轉(zhuǎn)發(fā)(transfer)和接收(receiver)三部分。當(dāng)transfer啟動時加入p2p網(wǎng)絡(luò),并且在p2p網(wǎng)絡(luò)中發(fā)布提供即時通信服務(wù)的通告。sender加入p2p網(wǎng)絡(luò),通過查找p2p網(wǎng)絡(luò)通告尋找提供服務(wù)的transfer,選擇transfer形成p2p網(wǎng)絡(luò)通道。sender在這個通道基礎(chǔ)上建立與目的端的socket連接,將信息傳遞到receiver。傳遞的信息是用xml形式封裝的字節(jié)數(shù)組,數(shù)據(jù)被保存在xml文件中,由transfer解析出數(shù)據(jù)。通過通道中的各個transfer對信息進(jìn)行加密及解密操作,實(shí)現(xiàn)sender和receiver之間的通信。當(dāng)用戶運(yùn)行該軟件時,會出現(xiàn)登陸界面,如圖2所示,如果用戶是第一次運(yùn)行該程序,并沒有任何默認(rèn)的設(shè)置,jxta會彈出jxta gui 配置實(shí)用程序讓你進(jìn)行一些強(qiáng)制的和可選的設(shè)置。當(dāng)用戶輸入正確的用戶名和密碼之后,就會加入jxta網(wǎng)絡(luò),并啟動本機(jī)的jxta服務(wù),成為jxta網(wǎng)絡(luò)中的一個peer。


圖2系統(tǒng)通信過程示意圖 如圖2所示,a、b、p1、p2……p5都是存在于基于jxta的p2p網(wǎng)絡(luò)中的peer,其中的a希望與b建立連接進(jìn)行通信,而b收到a發(fā)出的advertisement并對其進(jìn)行驗(yàn)證,當(dāng)驗(yàn)證通過,則a與b之間建立pipe,進(jìn)行消息的傳遞。

2、 層次結(jié)構(gòu)

系統(tǒng)主要分成三個部分:

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不同類型的消息,對其信息進(jìn)行解密操作并且傳遞到j(luò)xta網(wǎng)絡(luò)中下一個peer的transfer,如果是最終結(jié)點(diǎn)peer就首先建立與receiver的連接,然后將信息解密之后,再解析xml文件得到數(shù)據(jù)傳遞到receiver。然后再接收receiver不同類型的消息,對其信息進(jìn)行加密操作并且傳遞到下一個peer的transfer ,直到傳回到sender。在sender請求建立通道時,必須根據(jù)sender 請求信息判斷這個transfer是作為中間結(jié)點(diǎn)處理數(shù)據(jù)還是作為最終結(jié)點(diǎn)處理數(shù)據(jù),兩者的處理信息方式有很大區(qū)別。如果信息傳遞過程中出現(xiàn)問題,將出錯信息傳回receiver。

(2)發(fā)送部分(sender)

sender主要負(fù)責(zé)查找jxta網(wǎng)絡(luò)中提供匿名通信服務(wù)的transfer,通過找到的transfer建立起一條基于p2p網(wǎng)絡(luò)的通道,然后就可以在這條通道上建立每一個socket通話連接,這樣通過這條通道就可以傳遞不同類型的信息(請求建立通道、數(shù)據(jù)、請求結(jié)束通話、請求關(guān)閉通道、建立通道允許、結(jié)束通話允許、關(guān)閉通道允許以及出錯信息)。在接收到receiver傳遞過來的信息時,由于經(jīng)過加密得到的是密文,必須按照建立的p2p網(wǎng)絡(luò)路徑的順序進(jìn)行解密,才能得到所需要的明文數(shù)據(jù)。在傳遞信息時,把需要傳遞的信息封裝成xml的格式,這樣在需要使用這些信息的transfer上就可以解析出所需要的數(shù)據(jù),以便于進(jìn)行下一步的操作。

(3)接收部分(receiver)

receiver主要負(fù)責(zé)在接收到p2p網(wǎng)絡(luò)中的transfer傳遞過來時的socket連接請求時同意socket連接,列出和自己建立連接的sender,通過選擇sender進(jìn)行基于p2p網(wǎng)絡(luò)的信息傳遞。在接收到p2p網(wǎng)絡(luò)中的transfer傳遞過來時的socket通話結(jié)束請求時關(guān)閉socket連接,同時取消在列表中的sender,這樣receiver就無法與結(jié)束通話的sender再次取得聯(lián)系。在receiver關(guān)閉時,必須通知所有已經(jīng)與自己連接的sender,sender才可以關(guān)閉與這個receiver的連接。

3、 具體實(shí)現(xiàn)及代碼分析

由于篇幅所限,在本文中我只對系統(tǒng)中的中繼轉(zhuǎn)發(fā)部分進(jìn)行介紹。

transfer部分主要包括如下幾個重要的類:

(1)transfer.class

該類主要是繼承了serversocket類,serversocket類是用來寫服務(wù)器程序的類,所謂服務(wù)器程序,通常會監(jiān)聽某一個連接端口,如果有某一臺客戶端計算機(jī)發(fā)出聯(lián)機(jī)的請求,則服務(wù)器就必須做出一些反應(yīng)。transfer.class除了繼承了serversocket的創(chuàng)建服務(wù)器監(jiān)聽端口,接受連接,關(guān)閉連接的功能之外,還定義了自己的功能函數(shù)——transnext(),與下一個p2p網(wǎng)絡(luò)結(jié)點(diǎn)peer

建立連接。

(2)newmsg.class和parsemsg.class

在信息傳遞的過程中,所有的數(shù)據(jù)都是以xml文件格式封裝的,將整個xml文件格式的信息作為整個字節(jié)數(shù)組byte[]進(jìn)行加密和解密,在需要的結(jié)點(diǎn)peer將字節(jié)數(shù)組的內(nèi)容寫入到xml文件中,再使用xml的解析方法將需要的數(shù)據(jù)解析出來。關(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ā)布通告。這個class文件對搭建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)樹的根結(jié)點(diǎn)

nodelist games=dom.getelementsbytagname(de); //取得需要解析的元素

for (int i=0;i

node anode=games.item(i);

namednodemap attributes=anode.getattributes();

contest=anode.getfirstchild().getnodevalue(); //得到元素de的值

for (int a=0;a

node theattribute=attributes.item(a); //取得元素de的屬性

type=theattribute.getnodevalue(); //得到元素de的屬性的值

}

}

}catch(exception e){}

}

四、 結(jié)束語

本文作者的創(chuàng)新點(diǎn)主要在于在jxta架構(gòu)的基礎(chǔ)上構(gòu)建一個p2p的即時通信息通。利用p2p非中心性和動態(tài)性的特征為即時通信服務(wù),在即時通信的過程中,在發(fā)送端對消息進(jìn)行加密,在接收端再對加密的消息解密,消息在jxta網(wǎng)絡(luò)中是以匿名方式的方式進(jìn)行傳輸?shù)?,使?shù)據(jù)傳輸更加安全。傳遞的信息是用xml形式封裝的字節(jié)數(shù)組,數(shù)據(jù)被保存在xml文件中,由transfer解析出數(shù)據(jù)。通過通道中的各個transfer對信息進(jìn)行加密及解密操作,實(shí)現(xiàn)客戶端和目的端之間的匿名通信。在系統(tǒng)的設(shè)計和實(shí)現(xiàn)過程中,對xml文件格式、jxta技術(shù)、加密解密技術(shù)等等做了一定的了解。但是由于時間倉促,且實(shí)驗(yàn)條件的限制,程序的在穩(wěn)定性方面仍然存在一定的問題,這有待于進(jìn)一步開發(fā)和完善。


p2p機(jī)相關(guān)文章:p2p原理




關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉