pdp协议:JXTA核心协议的对等机发现协议(PDP)来源: 发布时间:星期三, 2008年12月17日 浏览:2次 评论:0
对等机发现协议PDP(Peer Discovery Protocol)
PDP主要用来发布自己广告信息和查找其他Peer广告 如前篇文章所述Advertisement是Peer的间各种信息交流基本单元发现其他Peer及其他Peer及其资源问题就转换为发现描述各资源Advertisement问题只要找到对应Advertisement就相当于找到了该资源 PDP定义了发现其他Peer和资源协议该协议包括两个方面方面用于请求获得其他PeerAdvertisement;另方面用于响应其他Peer这种请求 1.PDP消息格式 PDP只由两种格式构成他们是: 用于发现Advertisement请求格式; 用于响应请求响应格式 这两种消息即发现请求消息和发现响应消息定义了两个Peer的间互相发现对方所需所有元素 虽然discovery消息定义了请求和对应响应但定要注意有时响应可能收不到有很多原因会造成对应某请求响应收不到比方说该请求未能生成任何结果或者响应超过定数额被请求对方忽略了(参考下Line 62~65) 2.Discovery Query Message 个Peer想要寻找某种Advertisement时就会发出Discovery Query Message(Discovery请求消息)这个请求消息格式如下: <?xml version =”1.0” encoding =”UTF-8”?> <jxta: DiscoveryQuery> <PeerAdv>…</PeerAdv> <Type>…</Type> <Attr>…</Attr> <Value>…</Value> <Threshold>…</Threshold> </jxta: DiscoveryQuery > PeerAdv:可选元素表示PeerID如果设置为null则转向Peer所在PeerGroup Type:有 3种类型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 MessagePeer创建个Discovery Response Message其中包含符合请求中要求Advertisement如Attr/Value要求或Advertisement类型要求 <?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元素样只有 3种类型:PEER(0)GROUP(1)ADV(2) Count:个包含eger值可选元素代表Message中响应元素总数目 Attr/Value:对可选元素和Discovery Query Message中值相同指明此响应产生时对应原始搜索条件 PeerAdv:个可选元素包含提供响应PeerPeer 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都会该listenerdiscoveryEvent思路方法并传递事件本身事件中包括了响应细节但discoveryEvent思路方法必须用到DiscoveryEvent类参数下面介绍下DiscoveryEvent类: 6.DiscoveryEvent类 作为discoveryEvent思路方法参数是为了提供DiscoveryService例子收到Discovery Response Message详情 7.发现远程Advertisements DiscoveryService接口提供了简便思路方法来给其他Peer发送Discovery Query Message不需要自己创建DiscoveryQueryMsg例子而是用getRemoteAdvertisements思路方法它有 5个参数第个参数为Peerid如果为空则会把请求发给本地网络上所有Peer并通过Rendezvous Peer对外广播(参考下Line38~39) 8.发现缓存Cache中Advertisement 响应个Discovery Query MessageAdvertisement会自动保存在本地Advertisement缓存Cache中DiscoveryListener实现中不需要再写缓存Cache并通过DiscoveryService接口getLocalAdvertisements思路方法这和寻找远程Peer区别用此思路方法可以马上得到结果不需要用DiscoveryListener实现来处理在DiscoveryResponseMsg响应中返回Advertisement马上返回个和请求参数相匹配AdvertisementEnumeration 9.清除缓存Cache中Advertisement 有时应用可能想清除所有缓存Cache比如应用很久没有使用估计所有Advertisement都已失效通过下面思路方法来清除缓存Cache中Advertisement: public void flushAdvertisement (String id, type); 10.有关Advertisement些问题 使用Advertisement:所有Advertisement都是从net.jxta.document.Advertisement抽象类继承而来Advertisement定义了几个思路方法最重要是getDocument思路方法该思路方法将Advertisement转换为特定MIME类型Document例子 例子化个Advertisement: PeerAdvertisement peerAdv = (PeerAdvertisement) AdvertisementFactory.Advertisement(“jxta:PA”); 或将“jxta:PA”改为:PeerAdvertisement.getAdvertisementType 发布Advertisement:发布有本地发布和远程发布 本地发布思路方法有: public void publish (Advertisement adv, type)throws IOException; public void publish (Advertisement adv, type,long letime,long letimeforOhers)throws IOException; 远程发布思路方法有: public void remotePublish (Advertisement adv, type); public void remotePublish (Advertisement adv, type, long letime); 还是先用个例子来介绍说明吧!:)这个例子用来介绍说明怎样发现网络上其他JXTA Peers 11.应用例子 Source Code: DiscoveryDemo.java 1 import java.util.Enumeration; 2 import net.jxta.discovery.*; 3 import net.jxta.exception.*; 4 import net.jxta.peergroup.*; 5 import net.jxta.protocol.*; 6 7 public DiscoveryDemo implements Runnable, DiscoveryListener { 8 9 PeerGroup netPeerGroup = null; 10 private DiscoveryService discovery; 11 12 // 开始配置JXTA平台 13 private void startJxta { 14 try { 15 netPeerGroup = PeerGroupFactory.NetPeerGroup; 16 }catch ( PeerGroupException e) { 17 18 //如果不能例子化Peer Group输出原因并结束 19 .out.prln("Fatal error : group creation failure"); 20 e.prStackTrace; 21 .exit(1); 22 } 23 24 //从Peer Group中发现服务器 25 discovery = netPeerGroup.getDiscoveryService; 26 } 27 28 // 线程将每分钟循环次直到发现Peers为止并显示找到结果 29 30 public void run { 31 try { 32 // 为 DiscoveryResponse events 添加 DiscoveryListener 33 discovery.addDiscoveryListener(this); 34 35 while (true) { 36 .out.prln("Sending a Discovery Message"); 37 // 寻找Peers每个Peer最多反馈5个 38 discovery.getRemoteAdvertisements(null, DiscoveryService.PEER, 39 null, null, 5); 40 41 // 等待分钟 42 try { 43 Thread.sleep(60 * 1000); 44 } catch(Exception e) {} 45 46 } 47 } catch(Exception e) { 48 e.prStackTrace; 49 } 50 } 51 52 // 为了实现 DiscoveryListener我们必须定义这个思路方法来处理所反馈信息 53 54 public void discoveryEvent(DiscoveryEvent ev) { 55 56 DiscoveryResponseMsg res = ev.getResponse; 57 String name = "unknown"; 58 59 // 获得Peers反馈广告 60 PeerAdvertisement peerAdv = res.getPeerAdvertisement; 61 62 // 些Peers不能反馈他们 PeerAdvertisement 63 (peerAdv != null) { 64 name = peerAdv.getName; 65 } 66 67 .out.prln ("Got a Discovery Response [" + 68 res.getResponseCount+ " elements] from peer : " + 69 name); 70 71 // 输出发现Peer 72 PeerAdvertisement adv = null; 73 Enumeration enum = res.getAdvertisements; 74 75 (enum != null ) { 76 while (enum.hasMoreElements) { 77 adv = (PeerAdvertisement) enum.nextElement; 78 .out.prln (" Peer name = " + adv.getName); 79 } 80 } 81 } 82 83 public void (String args) { 84 DiscoveryDemo myapp = DiscoveryDemo; 85 myapp.startJxta; 86 myapp.run; 87 } 88 } 个JXTA Peer 用getLocalAdvertisements思路方法来检索本地缓存Cache中Advertisements如果想发现其他Advertisements就必须用getRemoteAdvertisements来发送个Discovery Query Message给别PeersDiscovery 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来检索已经被发现任何结果并添加到本地缓存Cache中广告添加个Discovery Listener来通知发现Peer当discovery events被接收时discoveryEvent思路方法这里有两个思路方法添加Discovery Listener个是直接addDiscoveryListener(参考本Line33)另个是通过getRemoteAdvertisements思路方法本例用是第种思路方法如果采用第 2种思路方法可以将下Line38~39写成: discovery.getRemoteAdvertisements(null, DiscoveryService.PEER,null,null,5,this); 并去掉Line33行即可 如果你在运行上面时没有收到任何Discovery ResponseL!你很有可能没有正确配置好你JXTA平台环境请删除.jxta目录下PlatformConfig文件并重新运行 12.小结 本文讲述了JXTA平台如何处理发现其他Peer有关事宜以及JXTAJava参考实现中提供如何给其他Peer发送Discovery请求消息并处理返回响应还提到了利用Java参考实现中提供Discovery接口及实现如何在本地或远程发布Advertisement 当然上面所介绍PDP只是JXTA核心协议部分还有些协议将在以后文章中再介绍呵呵……:) 注:在JXTA里Advertisement(广告)相当于人类社会中名片在JXTA网络中所有资源都通过广告来描述用XML语言来描述Advertisement 0
相关文章
读者评论
发表评论 |