摘 要:本軟件的目的是要求解決傳統(tǒng)的基于C/S模式的即時(shí)通信軟件過分依賴于中心節(jié)點(diǎn)的性能的問題,基于P2P模式的即時(shí)通信軟件可以有效地解決這些問題。本軟件采用Java的基于P2P的Jxta網(wǎng)絡(luò)框架,軟件用IMbean鏈接GUI圖形界面的開發(fā)方式,并實(shí)現(xiàn)了多個(gè)Peer節(jié)點(diǎn)之間的信息收發(fā)。
關(guān)鍵詞:即時(shí)通信軟件; P2P模式; Jxta; Java
中圖分類號:TN87+; TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1004-373X(2010)14-0136-04
Java Realization of P2P Instant Messaging Software Based on Jxta
QING Lin
(Hunan Normal University, Changsha 410006,China)
Abstract: The purpose of this software is to figure out the problem that the common instant message software mostly depended on the ability of the centre pole. The software is based on the frame of JXTA of the JAVA, and uses the development method of linking GUI with IMbean, achieves the posting of messages between every Peer.
Keywords: instant messaging software; P2P; Jxta; Java
P2P技術(shù)是目前非常流行的一種分布式計(jì)算技術(shù),P2P網(wǎng)絡(luò)的基礎(chǔ)單位是對等點(diǎn),每個(gè)對等點(diǎn)之間能夠互訪。SUN公司針對P2P技術(shù)的特點(diǎn)提出了自己關(guān)于P2P網(wǎng)絡(luò)的Jxta研究項(xiàng)目,本文設(shè)計(jì)的即時(shí)通信軟件便是基于該技術(shù)來開發(fā)的。
1 軟件實(shí)現(xiàn)
1.1 系統(tǒng)架構(gòu)
Jxta P2P applications即本文所設(shè)計(jì)的軟件是建立在JavaBean上的,JavaBean是一種類,它針對特定的用途封裝了屬性和方法[1],實(shí)現(xiàn)特定的用途,而下面的JAL是Java的抽象層,它直接隔開了Jxta的平臺,為上層的程序管理Jxta的對等體,廣告,管道以及其他各種底層的實(shí)現(xiàn)和細(xì)節(jié)[2]。
1.2 總體設(shè)計(jì)步驟和方法
總體設(shè)計(jì)步驟和方法[3]如下:
(1) 設(shè)計(jì)JAL;
(2) 設(shè)計(jì)本軟件的中的JavaBean,即IMbean;
(3) 創(chuàng)建應(yīng)用程序VSJChat的GUI圖形界面;
(4) 鏈接IMbean和應(yīng)用程序GUI,以實(shí)現(xiàn)功能[4]。
1.3 設(shè)計(jì)JAL的Peer接口
JAL實(shí)際上也是API即引用程序接口,實(shí)現(xiàn)以下功能:
(1) 發(fā)現(xiàn)Peer同時(shí)能被發(fā)現(xiàn);
(2) 搜索其他Peer和Peer群;
(3) 創(chuàng)建和管理Peer群;
(4) 和其他Peer的交流;
(5) 獲得其他Peer或者Peer群的信息[5]。
Peer接口設(shè)計(jì)程序如下所示:
public interface Peer{ //開始
public void boot(String name)
throws Exception;
public void boot(String name,
String group)throws Exceptio
//申明可用性
public void publish()
throws Exception; //Peer信息
public String getName();
public String[]getPeers()
throws Exception; //發(fā)送和接收信息
public boolean sendMessage(
String name,Message msg)
throws Exception;
public boolean broadcast
(Messagemsg)throws Exception
public Message receiveMessage()
throws Exception; //信息處理
public Message newMessage();
public void pushObject(Message m
String tag,Object obj)
throws Exception;
public Object popObject(
Message msg,String tag)
throws Exception; //群處理
public void createGroup(
String name)throws Exceptio
public void joinGroup(String name
throws Exception;
public String[]getGroups()
throws Exception;
public void createAndOrJoinGroup
String name)throws Exceptio
public void leaveGroup(String nam
throws Exception;
//信息效用
public boolean
searchGroupWithName(String name)
throws Exceptio
public boolean
searchPeerWithName(String n
throws Exception;
public void displayPeers()
throws Exception;
public void displayGroups()
throws Exception;
public void displayServices()
throws Exception;
public String getPeerStatistics();
}
1.4 IMbean的設(shè)計(jì)
IMBean是在JAL基礎(chǔ)上開發(fā)的一個(gè)應(yīng)用JavaBean。它的作用是:處理所有的Jxta細(xì)節(jié)問題(包括初始化Peer,異常處理)[6];處理輸入信息,傳輸?shù)絍SJChat;處理輸出信息,通過Jxta網(wǎng)絡(luò)發(fā)送。
1.5 應(yīng)用程序VSJChat的GUI圖形界面的創(chuàng)建
利用圖形編輯器創(chuàng)建GUI圖形界面。使用的開發(fā)工具是NetBeans,利用其中的圖形編輯器創(chuàng)建。層結(jié)構(gòu)和每個(gè)GUI組件的類型,各個(gè)按鈕的名字將顯示在圖像界面中。
GUI產(chǎn)生代碼程序如下所示:
Public class VSJChat extends Javax.swing.JFrame{
/**產(chǎn)生新模板VSJchat*/
public VSJChat(){
...
}
private void initComponents(){
chatBean1=new
org.Jxta.ezel.beans.imbean.IMBean();
jPanel1=new Javax.swing.JPanel();
jTextField1=new Javax.swing.JTextField();
jButton1=new Javax.swing.JButton();
jPanel2=new Javax.swing.JPanel();
jTextArea1=new Javax.swing.JTextArea();
setTitle(\"VSJ P2P World Wide Messaging-100%Java Edition\");
addWindowListener(new
Java.awt.event.WindowAdapter(){
public void windowClosing
(Java.awt.event.WindowEvent evt){
exitForm(evt);
}
});
jPanel1.setLayout(new Java.awt.BorderLayo
jTextField1.setColumns(40);
jTextField1.setFont(new Java.awt.Font(
\"Dialog\",0,10));
jPanel1.add(jTextField1,
Java.awt.BorderLayout.CENTER);
jButton1.setText(\"Send Message\");
jPanel1.add(jButton1,Java.awt.BorderLayou
getContentPane().add(jPanel1,
Java.awt.BorderLayout.SOUTH);
jPanel2.setLayout(new Java.awt.BorderLayo
jTextArea1.setEditable(1);
jTextArea1.setFont(new
Java.awt.Font(\"Dialog\",2,12));
jTextArea1.setFocusable(1);
jTextArea1.setMinimumSize(new
Java.awt.Dimension(500,400));
1.6 建立IMBean和應(yīng)用程序VSJChat的鏈接
1.6.1 導(dǎo)入IMBean
在IDE開發(fā)工具中加入代碼來導(dǎo)入IMBean,修改VSJChat產(chǎn)生構(gòu)造器來完成的。在源程序中創(chuàng)建了一個(gè)特別的構(gòu)造器,它用2個(gè)字符串作為參數(shù),并為一個(gè)私有方法localInit()構(gòu)造出初始化代碼。用一個(gè)發(fā)送者或?qū)Φ葯C(jī)名字和一個(gè)群名調(diào)用initBean()方法將激活在特定的群中的關(guān)聯(lián)對等機(jī)名的Jxta平臺。使用IMBean可加入到存在的被提供用戶名的IM會(huì)話中。在localInit()方法中,可以設(shè)置其他可獲得的IMBean參數(shù),如alias和topic properties[7]。
程序:導(dǎo)入bean
public VSJChat(){
mySenderName=\"noname\";
myGroupName=\"netpeergroup\";
localInit();
}
public VSJChat(String peername,String groupname){
mySenderName=peername;
myGroupName=groupname;localInit();
}
private void localInit(){
initComponents();
try{
chatBean1.initBean(mySenderName,myGroupName);
}catch(Exception ex){
ex.printStackTrace();
}
chatBean1.setSenderName(mySenderName);
chatBean1.setAlias(\"NOALIAS\");
chatBean1.setTopic(\"ALL\");
jTextField1.requestFocus();
1.6.2 實(shí)現(xiàn)IMBean發(fā)信息的功能
在GUI圖形界面中把jBotton1的按紐命名為“Send Message”。運(yùn)用NetBeans3.5的GUI編輯器,選中jBotton1組件,選擇事件標(biāo)簽的屬性列,點(diǎn)擊為事件名“actionPerformed”的屬性名,再輸入事件處理器的名字“SendClick”。這將在VSJChat中自動(dòng)創(chuàng)建一個(gè)事件處理器方法。
產(chǎn)生事件監(jiān)聽者程序[8] 如下所示:
jButton1.addActionListener(new Java.awt.event.ActionListener(){
public void actionPerformed(Java.awt.event.ActionEvent evt)
SendClicked(evt);
}
);
SendClicked()方法也同時(shí)產(chǎn)生了。填充這個(gè)方法,通過IMbean來取得用戶輸入和發(fā)送的消息。
獲得用戶輸入和發(fā)送的信息程序如下所示:
private static final String CHAT_SEP=\">\";
private static final String CR=\"\\\\";
private static final String EMPTY_TEXT=\"\";
private StringBuffer curMsgs=new
StringBuffer(EMPTY_TEXT);
private void SendClicked(
Java.awt.event.ActionEvent evt){
try{String latestMsg=jTextField1.getText();
chatBean1.sendMessage(latestMsg);
curMsgs.append(mySenderName+
CHAT_SEP+latestMsg+CR);
jTextArea1.setText(curMsgs.toString());
jTextField1.setText(EMPTY_TEXT);
jTextField1.requestFocus();
}catch(Exception ex){
ex.printStackTrace();
} }
在使用者打完字時(shí)按下回車鍵來發(fā)送信息。這可以在處理jTextFieldv1組件的actionPerformed()事件中完成。再一次使用GUI編輯器,這次選擇jTextField1組件,調(diào)用TextFieldComplete()處理方法[9]。
程序:發(fā)送信息快捷方式
jTextField1.addActionListener(new
ava.awt.event.ActionListener(){
public void actionPerformed(
Java.awt.event.ActionEvent
evt){
TextFieldComplete(evt);
} });
然后可以填充TextFieldComplete()方法來簡單調(diào)用SendClick(),因?yàn)榛剀嚨韧邳c(diǎn)擊“Send Message”按紐。
發(fā)送信息程序如下所示:
private void TextFieldComplete(
Java.awt.event.ActionEvent evt){
SendClicked(evt);
})
1.6.3 實(shí)現(xiàn)IMBean接收信息功能
IMBean有2種接收信息的模式,事件處理和輪流檢測。因應(yīng)用程序不同,2種方法可以任選其一。本文用的是事件處理方式。可以在組件層級顯示中通過點(diǎn)擊IMBean組件,在屬性列表中選擇“event”標(biāo)簽,運(yùn)用IDE來加入1個(gè)對IMBean的MessageReceive事件的監(jiān)聽程序。這個(gè)事件處理器可稱為“messageHandler”。
IDE也為messageHandler()方法產(chǎn)生一個(gè)架構(gòu)代碼。這里,給找到接收的信息和刷新顯示在jTextArea中的信息填充邏輯語言[10]。
刷新顯示在jTextArea中的信息程序如下所示:
private void messageHandler(MessageReceivedEvent evt){
curMsgs.append(evt.getSender()+
CHAT_SEP+evt.getMessageText()
+CR);
jTextArea1.setText(
curMsgs.toString());
}
完成以上工作以后,VSJChat應(yīng)用程序的編寫就完成了。
1.7 實(shí)驗(yàn)結(jié)果
當(dāng)?shù)谝淮芜\(yùn)行VSJChat,Jxta GUI配置器會(huì)彈出,并要求設(shè)置配置參數(shù),在初始化配置后,這些配置將存儲在一個(gè).Jxta目錄中,以后重啟時(shí)將只為使用安全用戶名和密碼者提醒。按局域網(wǎng)上配置測試參數(shù)。首先,創(chuàng)建集合點(diǎn),這個(gè)可以用網(wǎng)上發(fā)布的目錄code/test/rdvnode中的runit.bat文件開始。仔細(xì)研究runit.bat文件,看到它實(shí)際上開始的是uk.co.vsj.Jxta2.wwm.RunRDV類,即:這個(gè)類的代碼創(chuàng)建一個(gè)Jxta群,把它作為一個(gè)群的集合點(diǎn)。現(xiàn)在開始第一個(gè)對等點(diǎn),即peer1,在code/test/peer1目錄下運(yùn)行runit,bat文件。繼續(xù)配置peer2,和peer1同樣設(shè)置。這個(gè)對等點(diǎn)可以通過code/test/peer2目錄下的runit.bat文件開始。運(yùn)行這2個(gè)Peer,運(yùn)用以上的命令,就可以用peer1和peer2運(yùn)行VSJChat了。雖然只運(yùn)行了2個(gè)peer,但按照上面的配置方法,只改變Peer的IP配置,在同一個(gè)VSJChat上運(yùn)行多少個(gè)Peer都是可以的。
2 結(jié) 語
本文著重介紹了如何實(shí)現(xiàn)了基于P2P網(wǎng)絡(luò)技術(shù)的即時(shí)通信軟件的對等體雙方互相收發(fā)信息。當(dāng)然P2P網(wǎng)絡(luò)時(shí)代的應(yīng)用還很多,今后本軟件將向著包含網(wǎng)絡(luò)存儲,分布式下載等更多的應(yīng)用功能的方向發(fā)展。
參考文獻(xiàn)
[1]吳先濤,吳承治.P2P技術(shù)及其演進(jìn)[J].現(xiàn)代傳輸,2008 (3):64-65.
[2]楊天路,劉宇宏,張文,等.P2P網(wǎng)絡(luò)技術(shù)原理與系統(tǒng)開發(fā)案例[M].北京:人民郵電出版社,2007.
[3]Scott Oaks,Bernard Traversat. Jxta技術(shù)手冊[M].北京:清華大學(xué)出版社,2004.
[4]宋雪昌.基于Jxta對等網(wǎng)絡(luò)的即時(shí)通信系統(tǒng)的研究與實(shí)現(xiàn)[D].蘇州:蘇州大學(xué),2005.
[5]周功業(yè),黎書生.新一代網(wǎng)絡(luò)計(jì)算模型:P2P及其Jxta體系結(jié)構(gòu)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2002(9):139-140.
[6]鄧杰文.P2P系統(tǒng)模型綜述[J].中國科技信息,2008(6): 116-117.
[7]吳國慶.對等網(wǎng)絡(luò)技術(shù)研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2008(7):100-101.
[8]許斌.Jxta-Java P2P網(wǎng)絡(luò)編程技術(shù)[M].北京:清華大學(xué)出版社,2003.
[9]Sun Microsystems Inc.. Project Jxta: an open innovative collaboration[ M] . [ S.l.] : SunMicrosystems Inc., 2001.
[10]李俊青.應(yīng)用Jxta實(shí)現(xiàn)P2P的方案研究[J].河北理工學(xué)院學(xué)報(bào),2003(4) :6-9.