PDP主要用来发布自己的广告信息,和查找其他Peer的广告。
如前篇文章所述,Advertisement是Peer之间各种信息交流的基本单元,发现其他Peer及其他Peer及其资源的问题就转换为发现描述各资源的Advertisement的问题,只要找到对应的Advertisement,就相当于找到了该资源。
PDP定义了发现其他Peer和资源的协议,该协议包括两个方面,一方面用于请求获得其他Peer的Advertisement;另一方面用于响应其他Peer的这种请求。
1.PDP的消息格式
PDP只由两种格式构成,他们是:
用于发现Advertisement的请求格式;
用于响应请求的响应格式。
这两种消息,即发现请求消息和发现响应消息,定义了两个Peer之间互相发现对方所需的所有元素。
虽然discovery消息定义了请求和对应的响应,但一定要注意,有时响应可能收不到,有很多原因会造成对应某请求的响应收不到,比方说该请求未能生成任何结果或者响应超过一定数额被请求对方忽略了(参考下程序Line 62~65)。
2.Discovery Query Message
一个Peer想要寻找某种Advertisement时,就会发出Discovery Query Message(Discovery请求消息),这个请求消息的格式如下:
xml 代码
- <?xml version =”1.0” encoding =”UTF-8”?>
-
- <jxta: DiscoveryQuery>
-
- <PeerAdv>…</PeerAdv>
-
- <Type>…</Type>
-
- <Attr>…</Attr>
-
- <Value>…</Value>
-
- <Threshold>…</Threshold>
-
- </jxta: DiscoveryQuery >
PeerAdv:可选元素,表示Peer的ID,如果设置为null,则转向Peer所在PeerGroup。
Type:有三种类型,PEER(0),GROUP(1),ADV(2)。
Attr和Value:都是可选元素,规定响应中的Advertisement需要满足的条件。前者指明Advertisement中的元素名,后者指明元素的值。只有满足这样的条件的Advertisement才能作为该请求的响应。
Threshold:也是个可选元素,该元素包括一个数字,指明最多可以接受多少数目的Advertisement。发出一个请求后,可能会有很多响应,指定了最多接受数目后,多余的会忽略掉。(参考下程序Line38~39)
特殊情况:
当Type设为0时,即请求获得Peer Advertisement时,将threshold也设为0,发出这种请求意味着请求方想想获得所有的Peer Advertisement。这样收到请求的所有Peer都响应,提供自己的Peer Advertisement。
如果Attr和Value的值没有设定,其他Peer响应时回复的是Advertisement的随机集合,当然前提是符合Type指定的类型而且未超过Threshold元素规定的最大响应数目。
3.Discovery Response Message
为了回复Discovery Query Message,Peer创建一个Discovery Response Message,其中包含符合请求中要求的Advertisement,如Attr/Value要求或Advertisement类型的要求。
xml 代码
- <?xml version =”1.0” encoding =”UTF-8”?>
-
- <jxta: DiscoveryQuery>
-
- <Type>…</Type>
-
- <Count>…</Count >
-
- <Attr>…</Attr>
-
- <Value>…</Value>
-
- <PeerAdv>…</PeerAdv>
-
- <Response Expiration =”expiration time”>
-
- …
-
- </Response>
-
- </jxta: DiscoveryQuery >
Type:与Discovery Query Message中的Type元素一样,只有三种类型:PEER(0),GROUP(1),ADV(2)。
Count:一个包含integer值的可选元素,代表Message中响应元素的总数目。
Attr/Value:一对可选元素,与Discovery Query Message中的值相同,指明此响应产生时对应的原始搜索条件。
PeerAdv:一个可选元素,包含提供响应的Peer的Peer Message。
Response:一个可选元素,包含符合Discovery Query Message中搜索要求的Advertisement。每个Discovery Response Message可以包含多了Response元素,没个元素只包含一个Advertisement。而Response元素个数之和为Count的值。 Response元素中的Expiration属性指明Advertisement的有效时间长度,当然,这个时间以毫秒为单位。
4.Discovery Service
服务的实例都与特定的Peer Group相关联。只有同一个Peer Group中的Peer才能通过服务来相互通信。默认情况下,所有的Peer都属于一个大的Peer Group,称为NetPeerGroup,因而所有的Peer及其Advertisement能相互发现。
Discovery Service提供了如下功能:
获得远程的Advertisement
获得本地的Advertisement
将Advertisement发布到本地
将Advertisement发布到远程
释放本地Advertisement
DiscoveryService接口为开发人员提供了简单的方法来发送discovery请求和处理discovery响应。使用 Discovery Service提供的方法来发送Discovery Query Message甚至不需要开发人员创建和发布DiscoveryQuery对象。
5.DiscoveryListener接口
发现discovery请求后,接到响应时应用程序需要获得通知以便取得响应中的Advertisement。在Java参考实现中,可以给 Discovery Service注册一个listener对象,当Discovery Response Messages到达时可以通过DiscoveryService获得通知。关于listener在Java中的作用,我在这里就不再多说了,如果不是很 懂的话,找本Java的基础书看看吧L!
每次DiscoveryService实例收到Discovery Response Message,都会调用该listener的discoveryEvent方法,并传递事件本身,事件中包括了响应的细节。但 discoveryEvent的方法必须用到DiscoveryEvent类的参数。下面介绍一下DiscoveryEvent类:
6.DiscoveryEvent类
作为discoveryEvent方法的参数,是为了提供DiscoveryService实例收到的Discovery Response Message的详情。
7.发现远程的Advertisements
DiscoveryService接口提供了简便的方法来给其他Peer发送Discovery Query Message,不需要自己创建DiscoveryQueryMsg实例,而是用getRemoteAdvertisements方法。它有五个参数,第 一个参数为Peerid,如果为空,则会把请求发给本地的网络上的所有Peer,并通过Rendezvous Peer对外广播。(参考下程序Line38~39)
8.发现缓存中的Advertisement
响应一个Discovery Query Message的Advertisement会自动保存在本地的Advertisement缓存中DiscoveryListener,实现中不需要再写 缓存的函数。并通过DiscoveryService接口的getLocalAdvertisements方法。这与寻找远程的Peer不同,用此方法可 以马上得到结果,不需要用DiscoveryListener实现来处理在DiscoveryResponseMsg响应中返回的 Advertisement,马上返回一个与请求参数相匹配的Advertisement的Enumeration。
9.清除缓存中的Advertisement
有时,应用程序可能想清除所有的缓存,比如应用程序很久没有使用,估计所有Advertisement都已失效。通过下面的方法来清除缓存中的Advertisement:
java 代码
- public void flushAdvertisement (String id,int type);
10.关于Advertisement的一些问题
使用Advertisement:所有的Advertisement都是从net.jxta.document.Advertisement抽象类 继承而来的。Advertisement定义了几个方法,最重要的是getDocument方法。该方法将Advertisement转换为特定MIME 类型的Document实例。
实例化一个Advertisement:
PeerAdvertisement peerAdv = (PeerAdvertisement) AdvertisementFactory.newAdvertisement(“jxta:PA”);
或将“jxta:PA”改为:PeerAdvertisement.getAdvertisementType()。
发布Advertisement:发布有本地发布和远程发布。
本地发布方法有:
java 代码
- public void publish (Advertisement adv, int type)throws IOException;
-
- public void publish (Advertisement adv,int type,long lifetime,long lifetimeforOhers)throws IOException;
远程发布方法有:
java 代码
- public void remotePublish (Advertisement adv, int type);
-
- public void remotePublish (Advertisement adv, int type, long lifetime);
还是先用一个例子来说明吧!:)这个例子用来说明怎样发现网络上的其他JXTA Peers。
11.应用实例
Source Code: DiscoveryDemo.java
java 代码
- import java.util.Enumeration;
- import net.jxta.discovery.*;
- import net.jxta.exception.*;
- import net.jxta.peergroup.*;
- import net.jxta.protocol.*;
-
- public class DiscoveryDemo implements Runnable, DiscoveryListener {
-
- static PeerGroup netPeerGroup = null;
- private DiscoveryService discovery;
-
-
- private void startJxta() {
- try {
- netPeerGroup = PeerGroupFactory.newNetPeerGroup();
- }catch ( PeerGroupException e) {
-
-
- System.out.println("Fatal error : group creation failure");
- e.printStackTrace();
- System.exit(1);
- }
-
-
- discovery = netPeerGroup.getDiscoveryService();
- }
-
-
-
- public void run() {
- try {
-
- discovery.addDiscoveryListener(this);
-
- while (true) {
- System.out.println("Sending a Discovery Message");
-
- discovery.getRemoteAdvertisements(null, DiscoveryService.PEER,
- null, null, 5);
-
-
- try {
- Thread.sleep(60 * 1000);
- } catch(Exception e) {}
-
- }
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
-
-
-
- public void discoveryEvent(DiscoveryEvent ev) {
-
- DiscoveryResponseMsg res = ev.getResponse();
- String name = "unknown";
-
-
- PeerAdvertisement peerAdv = res.getPeerAdvertisement();
-
-
- if (peerAdv != null) {
- name = peerAdv.getName();
- }
-
- System.out.println ("Got a Discovery Response [" +
- res.getResponseCount()+ " elements] from peer : " +
- name);
-
-
- PeerAdvertisement adv = null;
- Enumeration enum = res.getAdvertisements();
-
- if (enum != null ) {
- while (enum.hasMoreElements()) {
- adv = (PeerAdvertisement) enum.nextElement();
- System.out.println (" Peer name = " + adv.getName());
- }
- }
- }
-
- static public void main(String args[]) {
- DiscoveryDemo myapp = new DiscoveryDemo();
- myapp.startJxta();
- myapp.run();
- }
- }
一 个JXTA Peer 用getLocalAdvertisements()方法来检索本地缓存中的Advertisements,如果想发现其他的 Advertisements,就必须用getRemoteAdvertisements(),来发送一个Discovery Query Message给别的Peers。Discovery Query Messages能发送给一个Peer,但也能发送到一个JXTA的网络上。在J2SE的平台上,Discovery Query Messages还可以发给一个rendezvous。如果这个Peer还没有连接到这个rendezvous上,那么Discovery Query Message将只有通过多次的尝试发送到本地的子网。一旦这个Peer已经连接上了一个rendezvous,那么Discovery Query Message也将被传送给这个rendezvous peer。一个Peer在Discovery Query Message里包括它自己的广告,完成一个公告或者是自动的发现机制。
有两个方法来接收DiscoveryResponse Message,你可以等候一个或多个Peer来响应DiscoveryResponse Message,并且调用方法getLocalAdvertisements()来检索已经被发现的任何结果,并添加到本地的缓存中的广告。添加一个 Discovery Listener来通知发现的Peer,当discovery events被接收时,调用discoveryEvent()方法。这里有两个方法添加Discovery Listener,一个是直接的addDiscoveryListener()(参考本程序Line33),另一个是通过 getRemoteAdvertisements()方法。本例用的是第一种方法,如果采用第二种方法,可以将下程序的Line38~39写成:
discovery.getRemoteAdvertisements(null, DiscoveryService.PEER,null,null,5,this);
并去掉Line33行程序即可。
如果你在运行上面的程序时,没有收到任何的Discovery Response,L!你很有可能没有正确的配置好你的JXTA平台环境。请删除.jxta目录下的PlatformConfig文件,并重新运行程序。
12.小结
本文讲述了JXTA平台如何处理发现其他Peer的有关事宜以及JXTA的Java参考实现中提供的如何给其他Peer发送Discovery请求消息并 处理返回的响应。还提到了利用Java参考实现中提供的Discovery接口及实现如何在本地或远程发布Advertisement。
当然,上面所介绍的PDP只是JXTA核心协议的一部分,还有的一些协议将在以后的文章中再介绍,呵呵……:)
注:在JXTA里,Advertisement(广告)相当于人类社会中的名片,在JXTA网络中的所有资源都通过广告来描述,用XML语言来描述Advertisement。
相关推荐
An Analysis of the Skype Peer to Peer Internet Telephony Protocol
核心协议主要包括了对等点发现协议(Peer Discovery Protocol),对等点信息协议(Peer Information Protocol),对等点监控协议(Peer Monitor Protocol),管道绑定协议(Pipe Binding Protocol),端点路由协议...
而`rabbitmq-peer-discovery-k8s`插件则是将RabbitMQ集群与Kubernetes(简称k8s)环境相结合的关键工具,它使得RabbitMQ节点能够自动发现彼此,从而简化了集群的管理和扩展。 **一、RabbitMQ集群基础** RabbitMQ...
### Chord:一种高效可扩展的对等查找协议 #### 概述 Chord是一种针对互联网应用设计的分布式查找协议,旨在解决对等(P2P)系统中的数据定位问题。该协议支持一种核心操作——根据给定的键映射到特定节点。通过将...
《Chord:一种适用于互联网应用的可扩展对等查找服务》是关于分布式系统领域内一个重要的研究主题——对等(P2P)网络中的数据定位技术。本文将深入解析Chord协议的核心概念、工作原理以及其在动态P2P系统中的高效性...
在这个场景下,我们关注的是一个名为"peer-discovery-rust"的项目,它是一个用Rust编程语言实现的对等发现协议。Rust是一种系统级编程语言,以其内存安全性、并发性和高性能而受到广泛关注。 首先,我们要理解Rust...
从标题和描述中我们可以了解到,文章主要探讨了对等网络(Peer-to-Peer, P2P)云计算资源配置服务发现以及负载均衡的技术。以下是对标题和描述中提到知识点的详细说明: 云计算(Cloud Computing):云计算作为一种...
对等组分析是一种用于监视数据挖掘情况下随时间变化的行为的新工具。特别是,该工具可以检测开始以与以前相似的帐户不同的方式运行的各个帐户。选择每个帐户作为目标帐户,并使用外部比较标准或内部标准对每个帐户的...
在IT领域,P2P(Peer-to-Peer)技术是一种分布式网络架构,它允许网络中的每个参与者,即“对等节点”(peers),既作为客户端又作为服务器,直接交换资源,无需通过中心服务器。这种架构在视频流系统中特别有用,...
P2P优秀论文_Peer-to-Peer体系结构及一种新型对等实体模型
### 对等复制(Peer to Peer Replication)- SQL Server 2008 #### 实验介绍及目标 **对等复制**是一种高级的数据库复制技术,尤其适用于SQL Server 2008这样的企业级数据库管理系统。它允许多个数据库服务器之间...
《对等网络(Peer to Peer):驾驭颠覆性技术的力量》一书由Andy Oram编辑,首次出版于2001年3月,是P2P技术领域的经典之作。该书全面探讨了P2P系统的发展目标、面临的问题以及开发者找到的技术解决方案。作者团队包括...
P2P,全称Peer-to-Peer,是对等计算的一种形式,它打破了传统的客户端/服务器(C/S)架构,让网络中的每个参与者,即“对等节点”(Peer),都能同时作为服务提供者和消费者。这种模式在近年来得到了广泛的关注,...
标题中的“Go-Pure-Go库用于使用UDP多播进行跨平台本地对等点发现”表明这个库是一个用纯Go语言编写的,专注于利用UDP多播实现跨平台的本地对等点(peer-to-peer,简称P2P)发现机制。在P2P网络中,各个节点既是服务...