王建
摘 要:JXTA是Sun公司專為P2P應(yīng)用程序所搭建的一個(gè)平臺(tái),該平臺(tái)可通過(guò)Java實(shí)現(xiàn)。通過(guò)JXTA平臺(tái)中的6大協(xié)議、3大層,運(yùn)用Java編程語(yǔ)言,能夠?qū)崿F(xiàn)基于多個(gè)peer節(jié)點(diǎn)的P2P即時(shí)通信。其中即時(shí)通信模塊是該軟件的核心部分,利用JXTA平臺(tái)提供的服務(wù)構(gòu)建一個(gè)輸入管道與輸出管道,設(shè)計(jì)一個(gè)JXTASocket包,將peer接口方法整合到該軟件包內(nèi),即可循環(huán)完成即時(shí)通信。文章基于JXTA平臺(tái),利用平臺(tái)的JAVA綁定,設(shè)計(jì)了一款混合型的P2P即時(shí)通信軟件,真正實(shí)現(xiàn)了P2P跨網(wǎng)絡(luò)的即時(shí)通信。
關(guān)鍵詞:JXTA;P2P;即時(shí)通信軟件;Java實(shí)現(xiàn)
P2P是Peer-to-Peer,是一種對(duì)等網(wǎng)絡(luò)工作模式,在此模式下,能夠?qū)⒎?wù)器弱化或者完全取消,所有結(jié)點(diǎn)均是服務(wù)器與客戶機(jī)的結(jié)合,是對(duì)等關(guān)系。P2P網(wǎng)絡(luò)具有良好的擴(kuò)展性,能夠更好地利用網(wǎng)絡(luò)邊緣資源,避免發(fā)生單點(diǎn)故障,是當(dāng)前互聯(lián)網(wǎng)領(lǐng)域應(yīng)用廣泛的一種模式[1]。
1 JXTA平臺(tái)
JXTA平臺(tái)是一個(gè)專為P2P網(wǎng)絡(luò)應(yīng)用的開發(fā)所設(shè)計(jì)的平臺(tái),既能夠?yàn)镻2P網(wǎng)絡(luò)的構(gòu)建提供一組協(xié)議,又能夠?yàn)镻2P應(yīng)用程序的開發(fā)提供一個(gè)平臺(tái),能夠提供基于Java語(yǔ)言的應(yīng)用程序編程接口(Application Programming Interface,API)。JXTA協(xié)議能夠支持多種對(duì)等點(diǎn)之間的直接通信,無(wú)需經(jīng)過(guò)中心服務(wù)器,即可相互發(fā)現(xiàn)并完成通信。其核心構(gòu)件包括peer(對(duì)等點(diǎn)),如PC機(jī)、傳感器或移動(dòng)通信設(shè)備等能夠?qū)崿F(xiàn)JXTA協(xié)議的實(shí)體;peer group(對(duì)等組),目的相同的對(duì)等點(diǎn)集合形成的一個(gè)跨越不同物理網(wǎng)絡(luò)的組;Service(服務(wù)),對(duì)等點(diǎn)與對(duì)等組均能夠提供服務(wù),對(duì)等點(diǎn)獨(dú)立提供一個(gè)peer服務(wù),對(duì)等組則由整個(gè)組提供一個(gè)peer group服務(wù);Pipe(管道),對(duì)等點(diǎn)之間的虛擬連接,是JXTA信息在各個(gè)節(jié)點(diǎn)之間發(fā)送與接收的途徑;Message(信息),JXTA平臺(tái)可以通過(guò)XML方式與二進(jìn)制方式傳遞信息;Advicement(廣告),利用XML文檔的方式交換JXTA中所有可用的信息,可以是一個(gè)對(duì)等點(diǎn)、一個(gè)對(duì)等組、一個(gè)管道或者一個(gè)服務(wù)的信息[2]。
2 基于JXTA的P2P即時(shí)通信軟件的Java實(shí)現(xiàn)
2.1 peer接口的設(shè)計(jì)
JXTA中的peer之間通過(guò)Pipe完成通信,各Pipe都是通過(guò)相同的通信連接方式與過(guò)程運(yùn)行的,因此,可以將peer節(jié)點(diǎn)的連接設(shè)計(jì)為一個(gè)JXTASocket包,用以封裝全部的peer通信。該包中包含public interface peer{、public boolean bind()(peer和輸入管道綁定,并開始執(zhí)行監(jiān)聽功能)、public void run()(發(fā)送和輸入管道綁定的信息)、public boolean connect()(綁定輸出管道,并構(gòu)建通信連接)、public boolean sendMessage()(利用輸出管道發(fā)送信息)、public void setOutListener()(設(shè)定輸出管道的監(jiān)聽器)、public void setInListener()(設(shè)定輸入管道的監(jiān)聽器)、public void createGroup()(建立對(duì)等組)、public void joinGroup()(加入對(duì)等組)、public void leaveGroup()(離開對(duì)等組)、public boolean searchGroupWithName()(搜索對(duì)等組)、public boolean searchPeerWithName()(搜索對(duì)等點(diǎn))等方法。
2.2 聊天信息即時(shí)通信的實(shí)現(xiàn)流程
(1)通過(guò)DiscoveryService構(gòu)建一個(gè)信息輸入管道:以 pipeSvc.createInputPipe()。(2)執(zhí)行監(jiān)聽,設(shè)定一個(gè)輸入管道Listener,設(shè)定public void pipeMsgEvent()的方法,消息到來(lái)時(shí),該程序就會(huì)自動(dòng)監(jiān)聽。(3)解析收到的信息,利用信息解析協(xié)議,通過(guò)String userName,String sendContent對(duì)消息進(jìn)行解析。(4)與監(jiān)聽到的管道通知進(jìn)行連接,并構(gòu)建一個(gè)信息輸出管道pipeOutService.createOutputPipe()。(5)在輸出管道中利用newChatMessage()的方法發(fā)送信息,先將信息全部封裝為new Message,再利用輸出管道將其發(fā)送出去。(6)在信息到達(dá)輸入管道時(shí),再調(diào)用pipeMsgEvent()的方法,獲取、解析、顯示即時(shí)信息,完成這一步,即完成了一次完整的即時(shí)通信。這一流程的反復(fù)運(yùn)行,即是P2P即時(shí)通信系統(tǒng)的實(shí)現(xiàn)。
2.3 文件傳輸即時(shí)通信的實(shí)現(xiàn)
(1)通過(guò)輸入管道捕獲一個(gè)文件列表共享請(qǐng)求,并將共享列表發(fā)送出去,利用public void doFileListRequest()的方法完成。(2)捕獲文件列表,并顯示可供共享的一個(gè)文件列表,利用public void doFileList()的方法完成。(3)捕獲對(duì)等體共享文件下載請(qǐng)求,分析其請(qǐng)求的文件名,并生成文件流的相應(yīng)信息,再發(fā)送給對(duì)方,利用public void doFileListDownloadRequest()的方法完成。(4)捕獲文件流的對(duì)應(yīng)信息后,解析可供下載的文件名,再存儲(chǔ),public void doFileListDownload()的接口完成。(5)捕獲上傳后的文件流信息,分析文件名,再完成存儲(chǔ),public void doFileListUpload()的接口完成。
2.4 輸入管道的構(gòu)建步驟
(1)對(duì)于對(duì)等點(diǎn)發(fā)送的信息,首先要構(gòu)建一個(gè)管道廣告,再發(fā)布該廣告PipeAdvertisement myadv,并設(shè)定該廣告的ID及管道信息myadv.setPipeID,myadv.setName,在設(shè)定廣告類型時(shí),可選擇一對(duì)多的廣播型管道,也可選擇一對(duì)一的單播型管道。(2)發(fā)布廣告,讓相互通信的對(duì)等點(diǎn)能夠發(fā)現(xiàn)該廣告,DiscoveryService可用于該類服務(wù),設(shè)定disco.publish,disco.remotePublish的接口。(3)通過(guò)PipeService構(gòu)建一個(gè)基于該廣告的對(duì)應(yīng)輸入管道,并指定對(duì)應(yīng)的監(jiān)聽器,即可等待消息到達(dá),并實(shí)現(xiàn)即時(shí)通信。
2.5 GUI圖形界面的創(chuàng)建
GUI圖形界面為整個(gè)IM系統(tǒng)的模型,是用戶登錄整個(gè)系統(tǒng)時(shí)的初始運(yùn)行模塊,包含了登錄模塊、即時(shí)通信模塊、文件傳輸模塊、組管理模塊和用戶查找模塊,各模塊對(duì)應(yīng)不同的peer接口,完成整個(gè)系統(tǒng)的交互通信與顯示。
2.6 GUI界面與通信軟件的鏈接
通過(guò)IDE開發(fā)工具導(dǎo)入GUI界面,修改通信軟件生成構(gòu)造器。將構(gòu)造器建在源程序中,通過(guò)public VSJ Chat()代碼導(dǎo)入GUI界面,采用個(gè)性化的方法localinit()建立初始化代碼,建立發(fā)送者的名字MySenderName=""或發(fā)送群的名字MyGroupName=""。通過(guò)Beaninit()的方法調(diào)用對(duì)等機(jī)或群名,激活特定群中連接的對(duì)等機(jī)平臺(tái),將IM系統(tǒng)加入到用戶名已知的IM會(huì)話平臺(tái)中,即可構(gòu)建信息輸入管道與輸出管道發(fā)送或接收信息。
2.7 該軟件的技術(shù)優(yōu)勢(shì)
該軟件的設(shè)定基于JXTA平臺(tái)本身提供的能夠無(wú)視系統(tǒng)、語(yǔ)言、服務(wù)器的網(wǎng)絡(luò)限制等,為多個(gè)對(duì)等點(diǎn)提供一個(gè)最為實(shí)用、簡(jiǎn)捷的即時(shí)通信功能,既能夠用于聊天,也能夠用于文件傳輸。用戶信息與索引均無(wú)需借助服務(wù)器進(jìn)行存儲(chǔ),軟件在運(yùn)行時(shí)對(duì)服務(wù)器的依賴性極低,即使服務(wù)器受到攻擊,也不會(huì)影響軟件的繼續(xù)運(yùn)行。用戶在交換信息時(shí),不需要有確定的準(zhǔn)確地址,能夠跨過(guò)防火墻及NAT設(shè)備,實(shí)現(xiàn)暢通交流。用戶通過(guò)JXTA平臺(tái)能夠真正實(shí)現(xiàn)peer-to-peer的對(duì)等通信,對(duì)于編程語(yǔ)言、開發(fā)平臺(tái)及傳輸協(xié)議無(wú)依賴性,能夠接入任意數(shù)字設(shè)備,無(wú)需在指定的PC機(jī)或其他平臺(tái)上接入。用戶的即時(shí)通信無(wú)需借助網(wǎng)絡(luò),TCP/IP,藍(lán)牙,HTTP或者家庭網(wǎng)絡(luò)等都能夠即時(shí)傳送信息,借助于JXTA提供的6大協(xié)議,在相同網(wǎng)絡(luò)中的對(duì)等點(diǎn)可以方便地進(jìn)行通信,真正實(shí)現(xiàn)了分布式的P2P通信。目前JXTA平臺(tái)自身即提供了Java語(yǔ)言綁定,在任意JXTA平臺(tái)運(yùn)行P2P程序都能夠直接按照自身喜好配置網(wǎng)絡(luò)環(huán)境,通過(guò)該平臺(tái)強(qiáng)大的網(wǎng)絡(luò)環(huán)境跨越能力,穿越各種網(wǎng)絡(luò)防火墻、網(wǎng)段、服務(wù)器代理等不同的網(wǎng)絡(luò)環(huán)境,實(shí)現(xiàn)即時(shí)通信,并利用Java綁定輕松的創(chuàng)建輸入與輸出管道,實(shí)現(xiàn)即時(shí)通信[3]。
3 實(shí)驗(yàn)結(jié)果
在JXTA平臺(tái)上運(yùn)行GUI界面,彈出配置器后,根據(jù)步驟與要求設(shè)置各項(xiàng)參數(shù),完成初始化配置,并將配置文件存儲(chǔ)于.JXTA目錄中,以用于之后使用時(shí)的用戶名與密度提醒。根據(jù)局域網(wǎng)要求設(shè)置測(cè)試參數(shù),建立集合點(diǎn)runit.bat文件,運(yùn)行該文件,即可根據(jù)代碼提供建立一個(gè)Jxta通信群,以此作為群集合點(diǎn)。根據(jù)對(duì)等機(jī)的數(shù)量,開始運(yùn)行各個(gè)對(duì)等點(diǎn),每個(gè)對(duì)等點(diǎn)均對(duì)應(yīng)一個(gè)runit.bat文件,逐個(gè)完成設(shè)置,即可運(yùn)行,再利用之前建立的管道與廣告運(yùn)行命令就可以在不同的對(duì)等點(diǎn)之間進(jìn)行即時(shí)通信。在通信過(guò)程中,需利用Recdezvous Peer將接收到的各對(duì)等機(jī)的廣告進(jìn)行緩存,以便突破內(nèi)網(wǎng)限制并發(fā)現(xiàn)所創(chuàng)建的PeerGroup。創(chuàng)建管道廣告(Pipe Advereisement),并使有固定的管道ID。利用PeerGroup與PipeAdvereisement構(gòu)建即時(shí)通信的虛擬通道。在兩臺(tái)機(jī)器中分別建立一個(gè)JxtaSocket,兩臺(tái)機(jī)器均建立代碼getInputStream()與getOutputStream(),以獲得輸入管道與輸出管道的廣告信息,并進(jìn)行讀出與寫入操作,進(jìn)而實(shí)現(xiàn)了兩臺(tái)不同機(jī)器的P2P即時(shí)通信。
4 結(jié)語(yǔ)
本文設(shè)計(jì)了一個(gè)使用Java語(yǔ)言的基于JXTA的P2P混合型即時(shí)通信軟件,通過(guò)Java語(yǔ)言、JXTA提供的六大協(xié)議與服務(wù),能夠自由地構(gòu)建輸入管道與輸出管道,從而完成對(duì)等組、對(duì)等點(diǎn)之間的廣告、消息和文件傳輸,為小型合作組的交流提供了一個(gè)更為友好的平臺(tái)。
[參考文獻(xiàn)]
[1]卿琳.基于JXTA的P2P即時(shí)通信軟件的Java實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2010(14):136-139.
[2]駱開華.基于JXTA平臺(tái)的P2P應(yīng)用實(shí)例的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2009(13):3362-3363.
[3]馮君.基于JXTA的即時(shí)通信系統(tǒng)研究與實(shí)現(xiàn)[J].濱州學(xué)院學(xué)報(bào),2014(6):92-97.