基于Jxta的P2P即时通信软件的Java实现

时间:2022-02-23 12:35:42

基于Jxta的P2P即时通信软件的Java实现

摘 要:本软件的目的是要求解决传统的基于C/S模式的即时通信软件过分依赖于中心节点的性能的问题,基于P2P模式的即时通信软件可以有效地解决这些问题。本软件采用Java的基于P2P的Jxta网络框架,软件用IMbean链接GUI图形界面的开发方式,并实现了多个Peer节点之间的信息收发。

关键词:即时通信软件; P2P模式; Jxta; Java

中图分类号:TN87+; TP311 文献标识码: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技术是目前非常流行的一种分布式计算技术,P2P网络的基础单位是对等点,每个对等点之间能够互访。SUN公司针对P2P技术的特点提出了自己关于P2P网络的Jxta研究项目,本文设计的即时通信软件便是基于该技术来开发的。

1 软件实现

1.1 系统架构

Jxta P2P applications即本文所设计的软件是建立在JavaBean上的,JavaBean是一种类,它针对特定的用途封装了属性和方法[1],实现特定的用途,而下面的JAL是Java的抽象层,它直接隔开了Jxta的平台,为上层的程序管理Jxta的对等体,广告,管道以及其他各种底层的实现和细节[2]。

1.2 总体设计步骤和方法

总体设计步骤和方法[3]如下:

(1) 设计JAL;

(2) 设计本软件的中的JavaBean,即IMbean;

(3) 创建应用程序VSJChat的GUI图形界面;

(4) 链接IMbean和应用程序GUI,以实现功能[4]。

1.3 设计JAL的Peer接口

JAL实际上也是API即引用程序接口,实现以下功能:

(1) 发现Peer同时能被发现;

(2) 搜索其他Peer和Peer群;

(3) 创建和管理Peer群;

(4) 和其他Peer的交流;

(5) 获得其他Peer或者Peer群的信息[5]。

Peer接口设计程序如下所示:

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; //发送和接收信息

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的设计

IMBean是在JAL基础上开发的一个应用JavaBean。它的作用是:处理所有的Jxta细节问题(包括初始化Peer,异常处理)[6];处理输入信息,传输到VSJChat;处理输出信息,通过Jxta网络发送。

1.5 应用程序VSJChat的GUI图形界面的创建

利用图形编辑器创建GUI图形界面。使用的开发工具是NetBeans,利用其中的图形编辑器创建。层结构和每个GUI组件的类型,各个按钮的名字将显示在图像界面中。

GUI产生代码程序如下所示:

Public class VSJChat extends Javax.swing.JFrame{

/**产生新模板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(false);

jTextArea1.setFont(new

Java.awt.Font("Dialog",2,12));

jTextArea1.setFocusable(false);

jTextArea1.setMinimumSize(new

Java.awt.Dimension(500,400));

1.6 建立IMBean和应用程序VSJChat的链接

1.6.1 导入IMBean

在IDE开发工具中加入代码来导入IMBean,修改VSJChat产生构造器来完成的。在源程序中创建了┮桓霆特别的构造器,它用2个字符串作为参数,并为┮桓霆私有方法localInit()构造出初始化代码。用一个发送者或对等机名字和一个群名调用initBean()方法将激活在特定的群中的关联对等机名的Jxta平台。使用IMBean可加入到存在的被提供用户名的IM会话中。在localInit()方法中,可以设置其他可获得的IMBean参数,如alias和topic properties[7]。

程序:导入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 实现IMBean发信息的功能

在GUI图形界面中把jBotton1的按纽命名为“Send Message”。运用NetBeans3.5的GUI编辑器,选中jBotton1组件,选择事件标签的属性列,点击为事件名“actionPerformed”的属性名,再输入事件处理器的名字“SendClick”。这将在VSJChat中自动创建一个事件处理器方法。

产生事件监听者程序[8] 如下所示:

jButton1.addActionListener(new Java.awt.event.ActionListener(){

public void actionPerformed(Java.awt.event.ActionEvent evt)

SendClicked(evt);

}

);

SendClicked()方法也同时产生了。填充这个方法,通过IMbean来取得用户输入和发送的消息。

获得用户输入和发送的信息程序如下所示:

private static final String CHAT_SEP=">";

private static final String CR="\\n";

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();

} }

在使用者打完字时按下回车键来发送信息。这可以在处理jTextFieldv1组件的actionPerformed()事件中完成。再一次使用GUI编辑器,这次选择jTextField1组件,调用TextFieldComplete()处理方法[9]。

程序:发送信息快捷方式

jTextField1.addActionListener(new

ava.awt.event.ActionListener(){

public void actionPerformed(

Java.awt.event.ActionEvent

evt){

TextFieldComplete(evt);

} });

然后可以填充TextFieldComplete()方法来简单调用SendClick(),因为回车等同于点击“Send Message”按纽。

发送信息程序如下所示:

private void TextFieldComplete(

Java.awt.event.ActionEvent evt){

SendClicked(evt);

})

1.6.3 实现IMBean接收信息功能

IMBean有2种接收信息的模式,事件处理和轮流检测。因应用程序不同,2种方法可以任选其一。本文用的是事件处理方式。可以在组件层级显示中通过点击IMBean组件,在属性列表中选择“event”标签,运用IDE来加入1个对IMBean的MessageReceive事件的监听程序。这个事件处理器可称为“messageHandler”。

IDE也为messageHandler()方法产生一个架构代码。这里,给找到接收的信息和刷新显示在jTextArea中的信息填充逻辑语言[10]。

刷新显示在jTextArea中的信息程序如下所示:

private void messageHandler(MessageReceivedEvent evt){

curMsgs.append(evt.getSender()+

CHAT_SEP+evt.getMessageText()

+CR);

jTextArea1.setText(

curMsgs.toString());

}

完成以上工作以后,VSJChat应用程序的编写就完成了。

1.7 实验结果

当第一次运行VSJChat,Jxta GUI配置器会弹出,并要求设置配置参数,在初始化配置后,这些配置将存储在一个.Jxta目录中,以后重启时将只为使用安全用户名和密码者提醒。按局域网上配置测试参数。首先,创建集合点,这个可以用网上的目录code/test/rdvnode中的runit.bat文件开始。仔细研究runit.bat文件,看到它实际上开始的是uk.co.vsj.Jxta2.wwm.RunRDV类,即:这个类的代码创建一个Jxta群,把它作为一个群的集合点。现在开始第一个对等点,即peer1,在code/test/peer1目录下运行runit,bat文件。继续配置peer2,和peer1同样设置。这个对等点可以通过code/test/peer2目录下的runit.bat文件开始。运行这2个Peer,运用以上的命令,就可以用peer1和peer2运行VSJChat了。虽然只运行了2个peer,但按照上面的配置方法,只改变Peer的IP配置,在同一个VSJChat上运行多少个Peer都是可以的。

2 结 语

本文着重介绍了如何实现了基于P2P网络技术的即时通信软件的对等体双方互相收发信息。当然P2P网络时代的应用还很多,今后本软件将向着包含网络存储,分布式下载等更多的应用功能的方向发展。

参考文献

[1]吴先涛,吴承治.P2P技术及其演进[J].现代传输,2008 (3):64-65.

[2]杨天路,刘宇宏,张文,等.P2P网络技术原理与系统开发案例[M].北京:人民邮电出版社,2007.

[3]Scott Oaks,Bernard Traversat. Jxta技术手册[M].北京:清华大学出版社,2004.

[4]宋雪昌.基于Jxta对等网络的即时通信系统的研究与实现[D].苏州:苏州大学,2005.

[5]周功业,黎书生.新一代网络计算模型:P2P及其Jxta体系结构的设计与实现[J].计算机应用研究,2002(9):139-140.

[6]邓杰文.P2P系统模型综述[J].中国科技信息,2008(6): 116-117.

[7]吴国庆.对等网络技术研究[J].计算机技术与发展,2008(7):100-101.

[8]许斌.Jxta-Java P2P网络编程技术[M].北京:清华大学出版社,2003.

[9]Sun Microsystems Inc.. Project Jxta: an open innovative collaboration[ M] . [ S.l.] : SunMicrosystems Inc., 2001.

[10]李俊青.应用Jxta实现P2P的方案研究[J].河北理工学院学报,2003(4) :6-9.

上一篇:数字PID控制算法在温控系统中的应用 下一篇:双目视觉中的角点检测算法研究