“最近几年,对等式网络模型P2P开始受到重视,成为最近的技术热点。P2P即Peer to Peer,称为对等连接或对等网络,它与传统的客户端/服务器(C/S)或浏览器/服务器(B/S)模式相比,最大的不同是降低了对服务器的依赖,在P2P网络中各Peer之间的关系是对等的,Peer同时具有Client和Server的特点。它们可以直接通信,进行文件传输,无需依赖集中式服务器或资源就可完成。
”作者:符巍,郑雪峰
一、 引言
最近几年,对等式网络模型P2P开始受到重视,成为最近的技术热点。P2P即Peer to Peer,称为对等连接或对等网络,它与传统的客户端/服务器(C/S)或浏览器/服务器(B/S)模式相比,最大的不同是降低了对服务器的依赖,在P2P网络中各Peer之间的关系是对等的,Peer同时具有Client和Server的特点。它们可以直接通信,进行文件传输,无需依赖集中式服务器或资源就可完成。
P2P技术将在网络尤其是宽带网络方面具备强大的应用潜力,2002 legend world大会上中科院计算机所的李国杰所长对P2P技术与网格技术的融和做出了非常有远见的预测,国外P2P网络流量占据了整个网络流量的40%,国外P2P网络注册用户超过3亿以上这些都是有力的证据,从试验科学的角度来看,P2P技术是因为解决了互联网模型中的弱链接模块的信息传递这个障碍,使得互联网的信息流动更加通畅才使他具备了这样强大的生命力和应用前景。
目前,P2P 技术的应用主要是在文件共享和即时通讯方面这两个方面。所谓即时通讯,其实指的就是诸如OICQ、ICQ等被称为在线聊天的软件。从某种意义上说,由于版 权的限制,即时通讯应用将超过文件共享应用,成为P2P的第一大应用。我基于JXTA(JXTA将在第二节作详细介绍)设计了一个简单的P2P即时通信系统,它可以实现互联网上任意两台主机之间的直接连接,不仅可以随时知晓对方在线与否,而且交流双方的通讯完全是点对点进行,不依赖服务器的性能和网络带宽,它为开发更多的P2P应用提供了基础。由于Java为网络编程提供了很好的支持和优化,并且是跨平台的,可移植性好,因此,我们选用Java作为开发语言。
二、 JXTA简介
由于P2P应用软件的前景看好,各大软件公司都在竞相开发P2P的软件开发产品,Sun的JXTA就是其中的一个。使用JXTA开发技术,软件开发人员可以开发出基于Java语言的P2P的应用软件。JXTA技术是一组开发式的协议,它们能够连接网络中的任何设备,从手提电话、无线PDA到台式电脑,让它们协同工作、共享资源。JXTA网络里面的全部结点共同组成了一个虚拟网络,里面的任何一个结点都能直接访问其他的结点,即使那些结点是位于防火墙的背后。
1、 使用JXTA技术来开发分布式计算软件,可以实现以下功能:
(1) 能够直接跟防火墙之后的其他结点连接;
(2) 简易的共享文档资料;
(3) 得到网络上包含的信息的简要目录;
(4) 建立结点群组来提供定制的服务;
可以在远端监视某个结点的行为。
2、 JXTA的软件结构分为以下三层(如图1所示)
(1)核心层(JXTA Core):它包含了服务所需要的核心功能,这一层封装了最根本的东西,包括Peer、对等组、Peer发现、Peer通信、Peer监视和相关的安全原语。
(2)服务层(JXTA Service):它提供了访问JXTA协议的接口,这一层包括了对于P2P网络不是必需的、但很通用的功能,如查找、共享、索引、代码缓存和内容缓存的机制。
(3)应用层(JXTA Application):它使用服务来访问JXTA网络和JXTA提供的功能。这一层包括了应用JXTA服务卡发出来的完整的P2P应用程序,例如myJXTA ,JXTA-CAD等应用程序。
图1 JXTA的层次结构三、 结构设计
1、 总体介绍
本系统是一个建立在基于JXTA的P2P网络之上的即时通信软件,它的功能类似于我们目前常常用到的即时通信软件,如OICQ、ICQ和MSN等。即时通信系统分为发送(sender)、中继转发(transfer)和接收(receiver)三部分。当transfer启动时加入P2P网络,并且在P2P网络中发布提供即时通信服务的通告。Sender加入P2P网络,通过查找P2P网络通告寻找提供服务的transfer,选择transfer形成P2P网络通道。Sender在这个通道基础上建立与目的端的SOCKET连接,将信息传递到receiver。传递的信息是用XML形式封装的字节数组,数据被保存在XML文件中,由transfer解析出数据。通过通道中的各个transfer对信息进行加密及解密操作,实现sender和receiver之间的通信。当用户运行该软件时,会出现登陆界面,如图2所示,如果用户是第一次运行该程序,并没有任何默认的设置,JXTA会弹出JXTA GUI 配置实用程序让你进行一些强制的和可选的设置。当用户输入正确的用户名和密码之后,就会加入JXTA网络,并启动本机的JXTA服务,成为JXTA网络中的一个Peer。
图2系统通信过程示意图如图2所示,A、B、P1、P2……P5都是存在于基于JXTA的P2P网络中的Peer,其中的A希望与B建立连接进行通信,而B收到A发出的Advertisement并对其进行验证,当验证通过,则A与B之间建立Pipe,进行消息的传递。
2、 层次结构
系统主要分成三个部分:
• P2P网络中的中继转发部分(transfer)
• 系统的发送部分(sender)
• 系统的接收部分(receiver)
(1)中继转发部分(transfer)
Transfer主要负责提供匿名通信的服务,接收sender不同类型的消息,对其信息进行解密操作并且传递到JXTA网络中下一个Peer的transfer,如果是最终结点PEER就首先建立与receiver的连接,然后将信息解密之后,再解析XML文件得到数据传递到receiver。然后再接收receiver不同类型的消息,对其信息进行加密操作并且传递到下一个Peer的transfer ,直到传回到sender。在sender请求建立通道时,必须根据sender 请求信息判断这个transfer是作为中间结点处理数据还是作为最终结点处理数据,两者的处理信息方式有很大区别。如果信息传递过程中出现问题,将出错信息传回receiver。
(2)发送部分(sender)
sender主要负责查找JXTA网络中提供匿名通信服务的transfer,通过找到的transfer建立起一条基于P2P网络的通道,然后就可以在这条通道上建立每一个SOCKET通话连接,这样通过这条通道就可以传递不同类型的信息(请求建立通道、数据、请求结束通话、请求关闭通道、建立通道允许、结束通话允许、关闭通道允许以及出错信息)。在接收到receiver传递过来的信息时,由于经过加密得到的是密文,必须按照建立的P2P网络路径的顺序进行解密,才能得到所需要的明文数据。在传递信息时,把需要传递的信息封装成XML的格式,这样在需要使用这些信息的transfer上就可以解析出所需要的数据,以便于进行下一步的操作。
(3)接收部分(receiver)
receiver主要负责在接收到P2P网络中的transfer传递过来时的SOCKET连接请求时同意SOCKET连接,列出和自己建立连接的sender,通过选择sender进行基于P2P网络的信息传递。在接收到P2P网络中的transfer传递过来时的SOCKET通话结束请求时关闭SOCKET连接,同时取消在列表中的sender,这样receiver就无法与结束通话的sender再次取得联系。在receiver关闭时,必须通知所有已经与自己连接的sender,sender才可以关闭与这个receiver的连接。
3、 具体实现及代码分析
由于篇幅所限,在本文中我只对系统中的中继转发部分进行介绍。
Transfer部分主要包括如下几个重要的类:
(1)TRANSFER.CLASS
该类主要是继承了SERVERSOCKET类,SERVERSOCKET类是用来写服务器程序的类,所谓服务器程序,通常会监听某一个连接端口,如果有某一台客户端计算机发出联机的请求,则服务器就必须做出一些反应。TRANSFER.CLASS除了继承了SERVERSOCKET的创建服务器监听端口,接受连接,关闭连接的功能之外,还定义了自己的功能函数——transnext(),与下一个P2P网络结点PEER
建立连接。
(2)NEWMSG.CLASS和PARSEMSG.CLASS
在信息传递的过程中,所有的数据都是以XML文件格式封装的,将整个XML文件格式的信息作为整个字节数组byte[]进行加密和解密,在需要的结点PEER将字节数组的内容写入到XML文件中,再使用XML的解析方法将需要的数据解析出来。关于XML文件部分的操作主要由NEWMSG.CLASS和PARSEMSG.CLASS完成,其中NEWMSG.CLASS主要是将收到的信息保存到XML文件中,而PARSEMSG.CLASS主要是解析出XML文件中需要的数据。
(3)JXTASHELL.CLASS
JXTASHELL.CLASS主要是使用JXTA创建P2P网络中的点组,初始化点组,创建通告,发布通告。这个CLASS文件对搭建P2P网络起了主要的作用。
下面是部分源代码:
public void workdealwith(String m,String de){ //解析XML文件元素
try{
DOMParser parser=new DOMParser();
parser.parse(m+“.xml”); //取得需要解析的XML文件
Document dom=parser.getDocument(); //dom为结点树的根结点
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){}
}
四、 结束语
本文作者的创新点主要在于在JXTA架构的基础上构建一个P2P的即时通信息通。利用P2P非中心性和动态性的特征为即时通信服务,在即时通信的过程中,在发送端对消息进行加密,在接收端再对加密的消息解密,消息在JXTA网络中是以匿名方式的方式进行传输的,使数据传输更加安全。传递的信息是用XML形式封装的字节数组,数据被保存在XML文件中,由transfer解析出数据。通过通道中的各个transfer对信息进行加密及解密操作,实现客户端和目的端之间的匿名通信。在系统的设计和实现过程中,对XML文件格式、JXTA技术、加密解密技术等等做了一定的了解。但是由于时间仓促,且实验条件的限制,程序的在稳定性方面仍然存在一定的问题,这有待于进一步开发和完善。
分享到:
猜你喜欢