JXTA核心协议之对等机发现协议(PDP)(三)

类别:Java 点击:0 评论:0 推荐:
还是先用一个例子来说明吧!:)这个例子用来说明怎样发现网络上的其他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 class DiscoveryDemo implements Runnable, DiscoveryListener { 8   9      static PeerGroup netPeerGroup = null; 10      private DiscoveryService discovery; 11  12      // 开始配置JXTA平台 13      private void startJxta() { 14          try { 15              netPeerGroup = PeerGroupFactory.newNetPeerGroup(); 16          }catch ( PeerGroupException e) { 17  18              //如果不能实例化Peer Group,输出原因并结束程序。 19              System.out.println("Fatal error : group creation failure"); 20              e.printStackTrace(); 21              System.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                  System.out.println("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.printStackTrace(); 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          if (peerAdv != null) { 64              name = peerAdv.getName(); 65          } 66  67          System.out.println ("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          if (enum != null ) { 76              while (enum.hasMoreElements()) { 77                  adv = (PeerAdvertisement) enum.nextElement(); 78                  System.out.println (" Peer name = " + adv.getName()); 79              } 80          } 81      } 82 83      static public void main(String args[]) { 84          DiscoveryDemo myapp = new DiscoveryDemo(); 85          myapp.startJxta(); 86          myapp.run(); 87      } 88  }   一个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。

本文地址:http://com.8s8s.com/it/it16796.htm